使用gzip压缩目录中已存在的.gz文件以外的文件


19

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

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

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

Answers:


26

您可以这样做:

gzip *

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

gzip -q *

您尝试的方法不起作用,因为gzip它无法读取要从stdin压缩的文件的文件名,因此必须使用:

ls | grep -v gz | xargs gzip

您将gz在文件名中的任意位置(不只是在结尾处)排除带有模式的文件。¹您还必须注意,ls当涉及到包含空格,换行符等文件名时,解析输出很危险。

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

find .  -type f ! -name "*.gz" -exec gzip {} \;



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


1
“ ...这使得它不太可能匹配文件名的某些内部部分”-它是grep,只需使用$它就可以了。而且你也没有逃脱.无论如何,所以它只是要排除的文件开始gz(因为它们不“之前的任何字符都gz”)
Izkata

1
@Izkata:否,包括未转义的点,并且不将正则表达式锚定$为排除(-v)所有文件名,该文件名由三个或更多字符组成,包括任何字符,后跟文件名中的“ gz”。因此,它将包括名称以“ gz”开头的文件。
暂停,直到另行通知。

1
@DennisWilliamson我的最后一条评论不清楚,它还将排除gz名称中带有任何地方的文件(开头除外)。因此最好还是将其锚定。没有使用过$,它看起来好像您没有意识到.正则表达式的含义,因此剩下的就是混乱的注释。
Izkata 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.