使用 gzip 压缩目录中的文件,除了已经存在的 .gz 文件

jab*_*jac 19 gzip

我有一个日志目录,我想设置一个作业来使用gzip进行压缩。问题是我不想重新压缩我已经压缩的日志。

我尝试使用ls | grep -v gz | gzip,但这似乎不起作用。

有没有办法做到这一点?基本上我想 gzip 目录中不以 .gz 结尾的每个文件。

Ant*_*hon 27

你可以这样做:

gzip *
Run Code Online (Sandbox Code Playgroud)

gzip 会告诉你它会跳过已经有.gz 结尾的文件。
如果该消息妨碍您可以使用:

gzip -q *
Run Code Online (Sandbox Code Playgroud)

您尝试的方法无效,因为gzip没有读取要从 stdin 压缩的文件的文件名,要使其正常工作,您必须使用:

ls | grep -v gz | xargs gzip
Run Code Online (Sandbox Code Playgroud)

您将gz在文件名的任何位置排除具有该模式的文件,而不仅仅是在末尾。¹ 您还必须注意,ls当文件名包含空格、换行符等时,解析 的输出是危险的。

一个更干净的解决方案,不依赖于gzip跳过带有.gz结尾的文件,它也处理子目录中的非压缩文件:

find .  -type f ! -name "*.gz" -exec gzip {} \;
Run Code Online (Sandbox Code Playgroud)



¹正如izkata评论:.gz单独使用来改善这一点,是行不通的。您需要使用grep -vF .gzgrep -v '\.gz$'。这仍然存在处理ls' 输出的危险