Подтвердить что ты не робот

Gzip несколько файлов по отдельности и сохранить исходные файлы

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

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

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

или

gzip *cache.html

но не сохраняет оригинал. Я попробовал

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

-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

Ответ 4

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

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

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