Вопрос по bash, gzip, linux, shell – Как сжать все файлы во всех подкаталогах в Bash

20

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

<code>for file in *; do gzip "$file"; done
</code>

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

Ваш Ответ

3   ответа
50

Нет необходимости в петлях или что-то более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
+1 за исключение * .gz файлов
Ты узнаешь что-то новое каждый день. Спасибо за урок!
Ваше последнее предложение - распространенная дезинформация. Find знает, где начинается имя файла и где оно заканчивается. Само по себе оно не имеет никаких проблем с пробелами или переносами строк и другими забавными вещами. Таким образом, `-exec gzip {}` вызывает gzip с одним именем файла, и поскольку не вызывается промежуточная оболочка, которая может интерпретировать пробел как разделитель, gzip получит все имя файла. Подсказка в man-странице find кажется устаревшей и означает: ваша оболочка может попытаться интерпретировать {} перед передачей для поиска, но такая оболочка не была обнаруженаfor years.
27

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

Разве это не лучший ответ ...?
5
find . -type f | while read file; do gzip "$file"; done
Поскольку ваш ответ был более правильным, и вы его необъяснимым образом опровергли, я изменил свой ответ, чтобы он был таким, какой был ваш. Просто отметьте, что "не продвигается" не обязательно означает активное снижение. Я бы изменил свой ответ или снял бы его после вашего комментария.
ИМХО, ответ неверный. Фаршид никогда не указывал, что файлы не содержат специальных символов, поэтому ваш ответ отвечает только на особый случай вопроса. Вы лучше используетеfind .. | while read .., Правильный ответ, и я буду первым, кто проголосует. Но не просите меня продвигать неправильные (IMO) ответы.
Что делать, если файл содержит пробелы или другие специальные символы? что не будет работать сfor там
@ c00kiemon5ter Заслуживает ли ответа ответ, который работает, но может быть неполным? Согласно SO & quot; Используйте свои отрицательные голоса всякий раз, когда вы сталкиваетесь с вопиюще неряшливым постом без лишних усилий или ответом, который явно и, возможно, опасно неправильный. & Quot; Этот ответ не из тех вещей. Неполный, несколько небрежный, но не неправильный. Вы, вероятно, должны были позволить процессу upvote взять свое и оставить комментарий.

Похожие вопросы