Назад | Перейти на главную страницу

Как я могу рекурсивно bzip2 все файлы, которые не bzip2?

Как я могу рекурсивно bzip2 все файлы, которые не заканчиваются на .bz2 расширение в Linux?

найди твой друг. Я считаю, что это должно сделать следующее:

find <target_dir> -not -name \*.bz2 -exec bzip2 \{\} \;

то есть, если каталог, в котором находятся файлы, которые вы хотите bzip, находится в / var / log / blah, это будет:

find /var/log/blah -not -name \*.bz2 -exec bzip2 \{\} \;

С помощью zsh (setopt extended_glob должен быть на):

bzip2 **/^*.bz2(.)

** рекурсии в подкаталогах; ^*.bz2 соответствует всему, кроме *.bz2; (.) ограничивается обычными файлами.

С bash 4, если вы не против игнорировать bzip2Жалуется на вызов в каталогах:

bzip2 **/!(*.bz2)

С ума сойти (извините, у меня нет оболочки для тестирования цитирования и т. Д.):

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 - обычно он лучше сжимает - или даже использовать tar-архив и вместо этого bzip2 или xz.

Вот один лайнер. При необходимости установить ifne первый. В Ubuntu:

sudo apt-get install moreutils

А потом:

find YOUR_DIR -type f -not -name \*.bz2 -print0 | ifne xargs -0 bzip2

Это делает то же самое, что и другие ответы, но вы не получите предупреждающих сообщений о каталогах bzip2ing, и если нечего bzip2 больше вы не будете получать предупреждающих сообщений о передаче сжатых данных bzip2 на терминал. Он также использует xargs и т.п.

YOUR_DIR может иметь подстановочные знаки или несколько каталогов, например ВАШ * DIR или подобное.

в fish console, это довольно просто, и вам не нужно беспокоиться о трубах и странных обратных косых чертах:

set files (find *)
for i in $files
    bzip2 $i
end