Réponses:
Placer chaque fichier dans un fichier tar distinct n'a aucun sens dans ce scénario. Vous pouvez utiliser gzip
pour les compresser directement:
gzip *
entraînera file1.out.gz
, file2.out.gz
etc.
Vous n'utiliseriez tar
que 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
find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
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
find . -type f -exec gzip {} \;
sera suffisant. Le deuxième code échouera avec les noms de fichiers contenant des espaces et similaires.
{}
par force d'habitude). Cependant, d'autres ont déjà posté ces réponses à votre question.
find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
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