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 Édouard Siha . Évalué à 4.
find /home/toto -name '*.jpg' | xargs tar zcf toto.tar.gz
[^] # Re: à première vue ça parait plutôt simple
Posté par ✅ ffx . Évalué à 8.
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 manud . Évalué à 2.
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 manud . Évalué à 1.
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 ✅ ffx . Évalué à 2.
[^] # Re: à première vue ça parait plutôt simple [Résolu]
Posté par manud . Évalué à 1.
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 ✅ ffx . Évalué à 3.
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 wismerhill . Évalué à 5.
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 ✅ ffx . Évalué à 2.
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 dinomasque . Évalué à 2.
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 manud . Évalué à 1.
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.