Gzip несколько файлов по отдельности и сохранить оригинальные файлы - PullRequest
12 голосов
/ 07 июня 2011

Я хочу сжать несколько файлов (в несколько файлов .gz) в каталоге, сохраняя оригиналы.

Я могу создавать отдельные файлы, используя следующие команды:

find . -type f -name "*cache.html" -exec gzip {} \;

или

gzip *cache.html

но ни один не сохраняет оригинал. Я пытался

 find . -type f -name "*cache.html" -exec gzip -c {} > {}.gz

но это только файл {} .gz. Есть ли простой способ сделать это?

Ответы [ 4 ]

9 голосов
/ 07 июня 2011

Ваш > в последней команде анализируется той же оболочкой, которая запускает find. Используйте вложенную оболочку:

find . -type f -name "*cache.html" -exec sh -c "gzip < {} > {}.gz" \;
9 голосов
/ 07 июня 2011

Я бы использовал bash(1) простую конструкцию for для этого:

for f in *cache.html ; do gzip -c "$f" > "$f.gz" ; done

Если бы я знал, что имена файлов были "нормальными", я бы пропустил "" вокруг аргументов, потому что я ленив. И мои имена файлов обычно нормальные. Но сценарии не имеют такой роскоши.

5 голосов

-k, --keep

gzip 1.6 (июнь 2013 г.) добавлена ​​опция -k, --keep, так что теперь вы можете:

find . -type f -name "*cache.html" -exec gzip -k {} \;
gzip -k *cache.html

или рекурсивно для всех файловпросто:

gzip -kr .

Найдено по адресу: https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file

0 голосов
/ 29 июня 2014

Поскольку у вас есть несколько файлов, GNU Parallel может быть полезен:

find . -type f -name "*cache.html" | parallel gzip '<{} >{}.gz'

Посмотрите вступительное видео для быстрого ознакомления: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

...