Как я могу рекурсивно 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