Я хочу сжать содержимое нескольких тысяч крошечных файлов в один файл. Хотя я мог бы сделать это с чем-то вроде for file in $(find . -iname 'pattern'); do; cat $file | gzip - >> zipped.gz; done;
Это дает довольно плохое сжатие с первого раза. Распаковать архив с zcat zipped.gz довольно просто. zcat zipped.gz | gzip --best > rezipped.gz
Я хотел бы знать, если кто-нибудь знает хороший способ сделать это за один проход.
2 ответа
Когда выяснилось, что лучшее поведение - это когда вы объединяете все файлы в один поток, я разбирался с циклом. Но потом я понял, что есть еще более простой (и лучший) способ:
find . -iname 'pattern' -exec cat {} \; | gzip --best - > file.gz
Все вызовы cat будут идти в стандартный поток find, есть только один вызов gzip. Повторное архивирование результата дает тот же размер файла. Возможно, вам удастся получить еще лучший результат (с точки зрения количества вызовов cat, а не размера файла), если вы используете + версию -exec (см. Справочную страницу поиска), но я этого не проверял.
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}
в цикл, чтобы избавиться от простых текстовых файлов.