Compressez chaque fichier d'un répertoire dans son propre fichier compressé

25

Comment compresser chaque fichier d'un répertoire dans son propre tar tout en préservant le nom de chaque fichier?

ie file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

DD.
la source

Réponses:

64

Placer chaque fichier dans un fichier tar distinct n'a aucun sens dans ce scénario. Vous pouvez utiliser gzippour les compresser directement:

gzip *

entraînera file1.out.gz, file2.out.gzetc.

Vous n'utiliseriez tarque si vous aviez besoin d'une archive compressée en tant que fichier unique.

Si vous avez besoin d'une archive tar pour chaque fichier, vous pouvez la créer comme suit:

for i in *; do tar -czf $i.tar.gz $i; done
Sven
la source
7
+1 - Il n'y a aucune raison de créer un tar (Tape ARchive) pour un seul fichier. Compressez simplement ce que vous voulez compresser - le résultat sera légèrement plus petit et aura infiniment plus de sens pour les personnes qui extraient les fichiers.
voretaq7
Pour tarer chaque sous-répertoire individuel (un seul niveau de profondeur) et supprimer l'original:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.
(impossible de modifier mon commentaire ci-dessus après 5 min) Une version plus simple / plus sûre:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.
9

Pour s'appuyer sur la réponse de @ SvenW (qui ne fonctionnera que sur le répertoire actuel), si vous avez un nombre ÉNORME de fichiers ou si vous souhaitez le faire sur une structure de répertoire récursive, vous pouvez également utiliser

find . -type f -exec gzip \{\} \;

et si vous devez placer la sortie dans un répertoire différent (dans cet exemple, ../target) et que vous ne voulez pas supprimer les originaux, vous pouvez faire quelque chose comme:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done
duveteux
la source
1
find . -type f -exec gzip {} \;sera suffisant. Le deuxième code échouera avec les noms de fichiers contenant des espaces et similaires.
utilisateur inconnu
Certains shells n'aiment pas les {} s nus, et le second fait quelque chose de nettement différent du premier (et j'étais conscient des problèmes d'espacement, mais c'est un peu délicat à gérer).
moelleux
Si vous connaissez un tel shell, je vous invite à répondre à ma question ici: unix.stackexchange.com/questions/8647/… . Personne n'a été en mesure de nommer quelque chose qui est actuellement utilisé jusqu'à présent. Si vous êtes conscient d'un risque lié à votre réponse, il peut être judicieux de le nommer dans votre réponse.
utilisateur inconnu
@userunknown J'ai été élevé sur (t) csh, qui a eu beaucoup de problèmes avec des accolades bouclées non échappées à un moment donné, bien que cela ne semble plus (mais j'échappe toujours {}par force d'habitude). Cependant, d'autres ont déjà posté ces réponses à votre question.
moelleux
Ou, pour compresser tous les fichiers non binaires:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.
0

Essaye celui-là:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
Des nattes
la source