Как я могу рекурсивно 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 или тому подобное.

Другие вопросы по тегам