web-dev-qa-db-fra.com

Comment compresser tous les fichiers dans tous les sous-répertoires de bash

Je veux parcourir les sous-répertoires de mon emplacement actuel et compresser chaque fichier séparément. Pour compresser des fichiers dans un répertoire, j'utilise

for file in *; do gzip "$file"; done

mais cela peut simplement fonctionner sur le répertoire courant et non sur les sous-répertoires du répertoire courant. Comment puis-je réécrire les instructions ci-dessus afin qu'il zippe également les fichiers dans tous les sous-répertoires?

21
Farshid

Pas besoin de boucles ou autre chose que find et gzip:

find . -type f ! -name '*.gz' -exec gzip "{}" \;

Cela trouve tous les fichiers normaux dans et en dessous du répertoire courant dont les noms ne se terminent pas par le .gz extension (c'est-à-dire tous les fichiers qui ne sont pas déjà compressés). Il appelle gzip sur chaque fichier individuellement.


Modifier, sur la base des commentaires de user unknown:

Les accolades ({}) sont remplacés par le nom de fichier, qui est transmis directement, sous la forme d'un seul mot, à la commande suivant -exec comme vous pouvez le voir ici:

$ touch foo
$ touch "bar baz"
$ touch xyzzy
$ find . -exec echo {} \;

./foo
./bar baz
./xyzzy
50
Adam Liss

Je préfèrerais gzip -r ./ qui fait la même chose mais est plus court.

35
Supernormal
find . -type f | while read file; do gzip "$file"; done
5
Tim Pote