24

我想在我当前位置的子目录中迭代并分别 gzip 每个文件。对于压缩目录中的文件,我使用

for file in *; do gzip "$file"; done

但这仅适用于当前目录,而不适用于当前目录的子目录。如何重写上述语句,以便它也压缩所有子目录中的文件?

4

4 回答 4

56

不需要循环或任何比findand更多的东西gzip

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

这将查找当前目录中及其下方名称不以.gz扩展名结尾的所有常规文件(即所有尚未压缩的文件)。它单独调用gzip每个文件。


编辑,基于来自的评论user unknown

花括号 ( {}) 被替换为文件名,该文件名作为一个单词直接传递给以下命令-exec,如您在此处看到的:

$ touch foo
$ touch "bar baz"
$ touch xyzzy
$ find . -exec echo {} \;

./foo
./bar baz
./xyzzy
于 2012-04-28T13:35:42.540 回答
54

我更喜欢gzip -r ./哪个做同样的事情但更短。

于 2014-03-06T12:41:41.870 回答
6
find . -type f | while read file; do gzip "$file"; done
于 2012-04-28T13:34:04.667 回答
0

我不能评论最上面的帖子(还......),但我在“find”的手册页中读到 -execDir 比 -exec 更安全,因为该命令是在找到匹配项的子目录中完成的,而不是比运行“查找”的父目录。

如果有人想使用正则表达式来定位要压缩的子目录中的特定文件,我建议使用

find ./ -type f -name 'addRegexHere' -execdir gzip -k "{}" \;

如果您不需要正则表达式,请坚持上面的递归 gzip 调用(或下面,如果我获得任何牵引力哈哈)

资源

于 2021-10-08T22:31:55.293 回答