2012-04-28 2 views
17

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

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

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

ответ

41

Нет необходимости в петлях или что-нибудь более 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

Ваше последнее предложение является общей дезинформацией. Поиск знает, где начинается имя файла и где оно заканчивается. Сам, у него нет никаких проблем с пробелами или разрывами строк и другими забавными вещами. Таким образом, '-exec gzip {}' вызывает gzip с одним именем файла, и поскольку никакая промежуточная оболочка не вызывается, которая может интерпретировать пробел как разделитель, gzip получит полное имя файла. Подсказка в справочной странице поиска кажется устаревшей и означает: ваша оболочка может попытаться интерпретировать {}, прежде чем передать ее, но ее не видели [в течение многих лет] (http://unix.stackexchange.com/q/ 8647/4485). –

+1

Вы узнаете что-то новое каждый день. Спасибо за урок! –

+2

+1 для файлов исключений * .gz – GuruM

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

Что делать, если файл содержит пробелы или другие специальные символы? что не будет работать с 'for' там – c00kiemon5ter

+1

@ c00kiemon5ter Ответ, который работает, но может быть неполным, заслуживает понижения? Согласно SO «Используйте ваши downvotes всякий раз, когда вы сталкиваетесь с грубым неряшливым, не затраченным на усилия сообщением или ответ, который явно и, возможно, опасно неверен». Этот ответ - ничто из этого. Неполный, несколько неряшливый, но не ошибочный. Вероятно, вы должны позволить процессу upvote взять на себя ответственность и оставить комментарий. –

+0

imo, ответ неправильный. Farshid никогда не указывал, что файлы не содержат специальных символов, поэтому ваш ответ отвечает только на частный случай вопроса. Вы лучше используете 'find .. | прочитав ..'. Исправьте свой ответ, и я буду первым, кто сможет продвинуться вперед. Но не просите меня продвигать неверные ответы (imo). – c00kiemon5ter

11

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

Смежные вопросы