Forum général.général Compression d'un seul type de fichier

Posté par  .
Étiquettes : aucune
0
20
avr.
2009
Bonjour à tous,

Je cherche à compresser qu'un seul type de fichier dans toute une arborescence mais je ne trouve pas la commande appropriée.

Par exemple je ne souhaite que les fichiers jpg. L'archive reprendrait l'arborescence mais nous n'aurions dedans que les fichiers jpg.
je pensais faire ceci

#!/bin/sh
find /home/toto -name *.jpg > sauvegardes.txt
touch toto.tar.gz

while read line

do nom=`echo $ligne`
tar -Azf toto.tar.gz $ligne

done < sauvegardes.txt

Mais cela ne marche pas, avez-vous une idée de comment faire?
Si quelqu'un pouvait m'aider, merci.

Merci
  • # à première vue ça parait plutôt simple

    Posté par  . Évalué à 4.

    J'aurai écrit quelquechose de ce genre :


    find /home/toto -name '*.jpg' | xargs tar zcf toto.tar.gz
    • [^] # Re: à première vue ça parait plutôt simple

      Posté par  . Évalué à 8.

      voire même
      find /home/toto -name '*.jpg' -print0 | xargs -0 tar zcf toto.tar.gz
      pour que cela fonctionne avec des noms de fichiers contenant des espaces

      Sinon "à vue de nez" le script initial aurait pu marcher si ce n'est qu'il faut le faire en .tar et pas .tar.gz (de toutes manières les jpg ca se compresse pas bien) à cause de deux soucis probables : le touch toto.tar.gz crée un fichier gzip invalide et le tar -A ne fonctionne pas sur des fichiers compressés.
      • [^] # Re: à première vue ça parait plutôt simple [Résolu]

        Posté par  . Évalué à 2.

        Merci à vous deux pour ces infos....

        J'ai utiliser le dernier script car j'ai des espaces dans mes fichiers et ça marche nickel.

        En fait ce ne sont pas des .jpg (j'ai mis ça comme exemple car bien connus) que je veux archiver mais des fichiers au format .top qui sont ceux d'un logiciels de 3D que les utilisateurs enregistrent sur un partage samba.

        Merci beaucoup ...
        • [^] # Re: à première vue ça parait plutôt simple [Résolu]

          Posté par  . Évalué à 1.

          Ha la la,

          Je reviens sur mon commentaire car cela marche mais la compression ce relance tout le temps

          En fait j'ai l'impression que pour chaque fichiers trouvés il relance l'archivage de l'ensemble.
          • [^] # Re: à première vue ça parait plutôt simple [Résolu]

            Posté par  . Évalué à 2.

            Quelle méthode as-tu utilisé (je n'ai pas bien compris) ?
            • [^] # Re: à première vue ça parait plutôt simple [Résolu]

              Posté par  . Évalué à 1.

              En fait j'ai repris ta méthode
              find /home/toto -name '*.top' -print0 | xargs -0 czf /home/sauvegardes/toto.tar.gz

              Mais lorsque je lance cette commande, il me met 5 fois
              tar: Retrait de "/" de tête des noms de membres

              et si je surveille, le fichier créé toto.tar.gz est régénéré 5 fois; la taille monte par exemple à 2,5 Go et redescend à 50Mo (donc la je pense qu'il refait l'archive) et remonte petit à petit pour recommencer (tout ça 5 fois).

              Je ne vois pas d'où ça peut venir.
              • [^] # Re: à première vue ça parait plutôt simple [Résolu]

                Posté par  . Évalué à 3.

                Retrait des / c'est normal, pour l'éviter ici il faut que tu fasses quelque chose comme
                cd /home/toto; find . -name ...
                quie te permettra d'avoir des chemins relatifs plutôt qu'absolus (que tar n'aime pas trop)

                Sinon pour ce que tu appelles regénération : a priori ce qu'il se passe c'est que tar concatene les fichiers que tu lui donnes jusqu'à obtenir un bloc d'une taille qu'il juge suffisante et qu'il compresse alors, et il poursuit ensuite avec le bloc suivant. En tout cas je suppose que c'est cela...


                Est-ce que la taille de ton fichier redescend exactement à la même valeur à chaque fois ?

                Combien de fichiers sont trouvés par le find ? 5 ou plus ?
  • # Tout est dans tar

    Posté par  . Évalué à 5.

    Je pense que tar propose suffisamment d'options pour gérer ton cas.
    Tu peux notamment mettre des règles d'(in|ex)clusion basées (ou non) sur des pattern.
    Tu as aussi l'option -T qui, si je ne m'abuse, permet de fournir une liste de fichiers dans un fichier texte, que tu peux générer facilement avec find.
    Tu peux d'ailleurs le combiner avec l'entrée standard (-T -) et l'option --null pour combiner directement ça à un find -print0, comem dans l'exemple plus haut mais en te passant de xargs (qui a pour effet de faire plusieurs appels si le nombre d'arguments est trop grand, d'où ton cas d'archive qui est réécrite plusieurs fois)
    • [^] # Re: Tout est dans tar

      Posté par  . Évalué à 2.

      Effectivement, grâce à toi je viens de remarquer le passage
      xargs executes the command one or more times
      du man, et cela veut bien dire que ce que j'ai proposé plus haut ne peut pas fonctionner dans le cas où trop de fichiers sont à ajouter...
      • [^] # Re: Tout est dans tar

        Posté par  . Évalué à 2.

        Quelle est la différence en pratique entre l'option "-exec" de find et l'appel de xargs ?

        La page de manuelle de find (version OpenBSD : http://www.openbsd.org/cgi-bin/man.cgi?query=find ) recommande la seconde solution "Since utility is executed every time a match is made, it is often more efficient to pipe the output of find to xargs(1)."

        Mais pourquoi ?

        BeOS le faisait il y a 20 ans !

    • [^] # Re: Tout est dans tar

      Posté par  . Évalué à 1.

      Merci pour vos réponses...

      Après quelques essais j'ai trouvé ce qu'il me fallait

      #!/bin/sh
      sauv=/home/sauvegardes/toto.tar.gz
      txt=sauvegardes.txt
      rm -fr $sauv
      find /home/toto -name '*.top' > $txt
      tar -czf $sauv -T $txt


      J'ai bien une archives qui ne se crée qu'une fois et qui ne contient que les fichiers .top

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.