Как я могу рекурсивно bzip2 все файлы, которые не bzip?
Как я могу рекурсивно bzip2 все файлы, которые не заканчиваются на .bz2
расширение в Linux?
5 ответов
Найти твой друг. Я считаю, что следующее должно сделать это:
find <target_dir> -not -name \*.bz2 -exec bzip2 \{\} \;
т.е. если каталог, в котором находятся файлы, которые вы хотите bzip - это /var/log/blah, это будет:
find /var/log/blah -not -name \*.bz2 -exec bzip2 \{\} \;
С головы до головы (извините, у вас нет удобной оболочки для тестирования цитат и т. Д.):
for _t in `find . -print |grep -v -E "\.bz$"`; do bzip2 -9 $_t && echo OK $_t || echo FAIL $_t; done
Он использует команду find для поиска всех файлов, grep удаляет файлы с расширением.bz2 и затем передает их по одному в bzip2. Я ожидаю, что некоторые цитаты неверны - сначала я бы протестировал бит в обратных цитатах отдельно.
Удачи! Возможно, вы захотите использовать вместо этого xz - обычно он лучше сжимается - или даже сменить все и вместо bzip2 или xz.
С зш (setopt extended_glob
должен быть на):
bzip2 **/^*.bz2(.)
**
рекурсы в подкаталогах; ^*.bz2
соответствует всему, кроме *.bz2
; (.)
ограничивает обычные файлы.
С bash 4, если вы в порядке с игнорированием bzip2
жалуется на ссылки на каталоги:
bzip2 **/!(*.bz2)
В fish
консоль, это довольно просто, и вам не нужно беспокоиться о каналах и странных обратных слешах:
set files (find *)
for i in $files
bzip2 $i
end
Вот один лайнер. При необходимости установите ifne
первый. На Ubuntu:
sudo apt-get install moreutils
А потом:
find YOUR_DIR -type f -not -name \*.bz2 -print0 | ifne xargs -0 bzip2
Это так же, как и другие ответы, но вы не получите предупреждающие сообщения о каталогах bzip2ing, и если нет ничего bzip2
больше вы не будете получать предупреждающие сообщения о сжатых данных bzip2ing в терминал. Он также использует xargs
и т.п.
YOUR_DIR может иметь подстановочные знаки или несколько DIR, например, YOUR*DIR или тому подобное.