Ответ 1
Ваша >
в последней команде обрабатывается той же оболочкой, которая запускает find
. Используйте вложенную оболочку:
find . -type f -name "*cache.html" -exec sh -c "gzip < {} > {}.gz" \;
Я ищу gzip несколько файлов (в несколько файлов .gz) в каталоге, сохраняя оригиналы.
Я могу делать отдельные файлы, используя следующие команды:
find . -type f -name "*cache.html" -exec gzip {} \;
или
gzip *cache.html
но не сохраняет оригинал. Я попробовал
find . -type f -name "*cache.html" -exec gzip -c {} > {}.gz
но это сделал только файл {}.gz. Есть ли простой способ сделать это?
Ваша >
в последней команде обрабатывается той же оболочкой, которая запускает find
. Используйте вложенную оболочку:
find . -type f -name "*cache.html" -exec sh -c "gzip < {} > {}.gz" \;
Я использовал бы конструкцию bash(1)
simple for
для этого:
for f in *cache.html ; do gzip -c "$f" > "$f.gz" ; done
Если бы я знал, что имена файлов "здравомыслящие", я оставил бы ""
вокруг аргументов, потому что я ленив. И мои имена файлов обычно нормальны. Но у сценариев нет такой роскоши.
-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
Поскольку у вас есть несколько файлов, GNU Parallel может быть полезна:
find . -type f -name "*cache.html" | parallel gzip '<{} >{}.gz'
Смотрите видеоролик для быстрого введения: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1