find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
Le -c
pousse le résultat vers stdout et conserve l'original seul. L'inconvénient est que vous devez trouver les fichiers vous-même. Pour un parcours plus sophistiqué, vous pouvez utiliser find(1)
, cependant, comme ci-dessus :.
recherche à partir du répertoire courant, et -type f
renvoie le nom de chaque fichier normal.
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
Vous pouvez facilement le changer pour inclure ce que vous voulez compresser ( -name '*.txt -or -name '*.html
etc.) au lieu de comme maintenant, en excluant certains fichiers (déjà compressés, fichiers de sauvegarde et fichiers temporaires).
Gère également très bien les espaces dans le nom de fichier.
Modifier gzip
à echo gzip
pour tester. Ou ignorez complètement la partie -exec.
Modifier : Oh, j'ai oublié de mentionner que cela ne vérifie pas si <target>.gz
existe déjà. Cela peut ou non être un problème.
Edit2 : Ok, nous y allons avec quelque chose qui vérifie le fichier existant. Si cela peut être voulu. Pardonnez la monotonie.
while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz"; fi done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))
Mon find
-foo n'est peut-être pas ce qu'il pourrait être, il peut très bien être possible de sauter directement dans find.
gzip -k
possibilité
gzip 1.6 (juin 2013) a ajouté le -k, --keep
option, vous pouvez donc :
gzip -kr .
et il ne supprimera pas vos fichiers d'origine.
Trouvé sur :https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file