Как gzip все файлы во всех подкаталогах в bash

Я хочу, чтобы итерация между подкаталогами моего текущего местоположения и gzip каждого файла отдельно. Для zip файлов в каталоге я использую

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

но это может работать только в текущем каталоге, а не в подкаталогах текущего каталога. Как я могу переписать вышеприведенные утверждения, чтобы он также застегнул файлы во всех подкаталогах?

Ответ 1

Нет необходимости в циклах или чем-то больше, чем find и gzip:

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

Это находит все обычные файлы в и ниже текущего каталога, чьи имена не заканчиваются расширением .gz (то есть все файлы, которые еще не сжаты). Он вызывает gzip для каждого файла по отдельности.


Изменить, на основе комментария от user unknown:

В фигурные скобки ({}) заменяются именем файла, которое передается непосредственно в виде одного слова команде -exec, как вы можете видеть здесь:

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

./foo
./bar baz
./xyzzy

Ответ 2

Я бы предпочел gzip -r ./, который делает то же самое, но короче.

Ответ 3

find . -type f | while read file; do gzip "$file"; done