2

Я хочу сжать содержимое нескольких тысяч крошечных файлов в один файл. Хотя я мог бы сделать это с чем-то вроде for file in $(find . -iname 'pattern'); do; cat $file | gzip - >> zipped.gz; done; Это дает довольно плохое сжатие с первого раза. Распаковать архив с zcat zipped.gz довольно просто. zcat zipped.gz | gzip --best > rezipped.gz Я хотел бы знать, если кто-нибудь знает хороший способ сделать это за один проход.

2 ответа2

3

Когда выяснилось, что лучшее поведение - это когда вы объединяете все файлы в один поток, я разбирался с циклом. Но потом я понял, что есть еще более простой (и лучший) способ:

find . -iname 'pattern' -exec cat {} \; | gzip --best - > file.gz

Все вызовы cat будут идти в стандартный поток find, есть только один вызов gzip. Повторное архивирование результата дает тот же размер файла. Возможно, вам удастся получить еще лучший результат (с точки зрения количества вызовов cat, а не размера файла), если вы используете + версию -exec (см. Справочную страницу поиска), но я этого не проверял.

1
find . -iname 'pattern' | xargs gzip -9 -v

РЕДАКТИРОВАТЬ

Кажется, что когда вы катаете файл, gzip лучше умеет его архивировать.

Это может работать:

for TXT in $(find /PATH/TO/TXT/FILES -iname '*.txt'); do cat ${TXT} | gzip -9 > ${TXT}.gz; done

На моем Mac оригинальный текстовый файл не был удален. Таким образом, исходный текстовый файл и заархивированный файл присутствовали после выполнения сценария.

Вы можете легко добавить

rm -f /PAHT /TO /TXT /FILES /$ {TXT}

в цикл, чтобы избавиться от простых текстовых файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .