我想在我当前位置的子目录中迭代并分别 gzip 每个文件。对于压缩目录中的文件,我使用
for file in *; do gzip "$file"; done
但这仅适用于当前目录,而不适用于当前目录的子目录。如何重写上述语句,以便它也压缩所有子目录中的文件?
不需要循环或任何比find
and更多的东西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
我更喜欢gzip -r ./
哪个做同样的事情但更短。
find . -type f | while read file; do gzip "$file"; done
我不能评论最上面的帖子(还......),但我在“find”的手册页中读到 -execDir 比 -exec 更安全,因为该命令是在找到匹配项的子目录中完成的,而不是比运行“查找”的父目录。
如果有人想使用正则表达式来定位要压缩的子目录中的特定文件,我建议使用
find ./ -type f -name 'addRegexHere' -execdir gzip -k "{}" \;
如果您不需要正则表达式,请坚持上面的递归 gzip 调用(或下面,如果我获得任何牵引力哈哈)