我希望将多个文件(到多个 .gz 文件)压缩到一个目录中,同时保留原始文件。
我可以使用这些命令来处理单个文件:
find . -type f -name "*cache.html" -exec gzip {} \;
或
gzip *cache.html
但两者都没有保留原始内容。我试过了
find . -type f -name "*cache.html" -exec gzip -c {} > {}.gz
但这仅生成了一个 {}.gz 文件。有没有简单的方法可以做到这一点?
我会使用
bash(1)
的简单 for
构造来实现:
for f in *cache.html ; do gzip -c "$f" > "$f.gz" ; done
如果我知道文件名是“正常的”,我就会省略参数周围的
""
,因为我很懒。我的文件名通常是正常的。但脚本没有那么奢侈。
最后一个命令中的
>
将由运行 find
的同一个 shell 进行解析。使用嵌套 shell:
find . -type f -name "*cache.html" -exec sh -c "gzip < {} > {}.gz" \;
-k, --keep
(gzip 1.6)
gzip 1.6(2013 年 6 月)添加了
-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