Gzip multiple files individually and keep the orig

2019-03-12 23:18发布

I am looking to gzip multiple files (into multiple .gz files) in a directory while keeping the originals.

I can do individual files using these commands:

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

or

gzip *cache.html

but neither preserves the original. I tried

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

but that only made a {}.gz file. Is there a simple way to do this?

4条回答
啃猪蹄的小仙女
2楼-- · 2019-03-12 23:20

-k, --keep

gzip 1.6 (June 2013) added the -k, --keep option, so now you can:

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

or for all files recursively simply:

gzip -kr .

Found at: https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file

查看更多
ら.Afraid
3楼-- · 2019-03-12 23:34

Since you have multiple files, GNU Parallel might be useful:

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

Watch the intro video for a quick introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

查看更多
放荡不羁爱自由
4楼-- · 2019-03-12 23:41

Your > in the last command gets parsed by the same shell which runs find. Use a nested shell:

find . -type f -name "*cache.html" -exec sh -c "gzip < {} > {}.gz" \;
查看更多
Animai°情兽
5楼-- · 2019-03-12 23:45

I'd use bash(1)'s simple for construct for this:

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

If I knew the filenames were 'sane', I'd leave off the "" around the arguments, because I'm lazy. And my filenames are usually sane. But scripts don't have that luxury.

查看更多
登录 后发表回答