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

BASH: преобразование bz2 в gzip с помощью find

Я хочу преобразовать несколько bzip2 файлы в gzip формат. Я добился этого с foor loop но я хотел бы сделать то же самое с find:

BASH для цикла:

for i in $(ls -1 *.bz2); do echo "Converting: $i to ${i%.bz2}.gz"; { bunzip2 -c $i | gzip > ${i%.bz2}.gz; }; done

Я пробовал что-то подобное, но не работает:

find . -name "*.bz2" -type f -exec bunzip2 -c {} | gzip > ${1%.bz2}.gz \;

Все не так просто. Find может вызывать только двоичный файл с аргументом "exec", но теперь вы пытаетесь вызвать канал bunzip | gzip. Это не простой двоичный файл, это цепочка двоичных файлов, и для запуска такой вещи вам нужно что-то, что может обрабатывать каналы.

Лучше всего для этого были снаряды. Вы должны вызвать оболочку, чтобы вызвать этот канал:

find . -name "*.bz2" -type f -exec bash -e 'bunzip2 -c {} | gzip > ${1%.bz2}.gz'

(Я не тестировал его, возможно, может возникнуть какая-то синтаксическая проблема, см. Это как шаблон.)