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?
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
Je préfèrerais gzip -r ./
qui fait la même chose mais est plus court.
find . -type f | while read file; do gzip "$file"; done