Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在bash中gzip所有子目录中的所有文件_Linux_Bash_Shell_Loops_Gzip - Fatal编程技术网

Linux 如何在bash中gzip所有子目录中的所有文件

Linux 如何在bash中gzip所有子目录中的所有文件,linux,bash,shell,loops,gzip,Linux,Bash,Shell,Loops,Gzip,我想在我当前位置的子目录中迭代,并分别对每个文件进行gzip。对于压缩目录中的文件,我使用 for file in *; do gzip "$file"; done 但这只适用于当前目录,而不适用于当前目录的子目录。如何重写上述语句,使其也能压缩所有子目录中的文件?无需循环或任何操作,只需find和gzip: find . -type f | while read file; do gzip "$file"; done find . -type f ! -name '*.gz' -exec

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

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

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

无需循环或任何操作,只需
find
gzip

find . -type f | while read file; do gzip "$file"; done
find . -type f ! -name '*.gz' -exec gzip "{}" \;
这将查找当前目录中及其下的所有常规文件,这些文件的名称不以扩展名
.gz
结尾(即,所有尚未压缩的文件)。它对每个文件分别调用
gzip


根据
用户未知的评论进行编辑:

大括号(
{}
)将替换为文件名,该文件名作为单个单词直接传递给
-exec
后面的命令,如下所示:

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

./foo
./bar baz
./xyzzy

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

如果文件包含空格或其他特殊字符怎么办?对于
there@c00kiemon5ter一个有效但可能不完整的答案值得否决吗?根据SO的说法,“当你遇到一篇极其草率、不费力气的帖子,或者一个明显而且可能危险地错误的答案时,就用你的反对票。”这个答案不是这些。不完整,有点马虎,但不是不正确。你可能应该让投票过程付出代价并留下评论。依我看,答案是错误的。Farshid从未指定文件不包含特殊字符,因此您的答案只回答问题的特殊情况。你最好使用
find读取时..
。更正你的答案,我将第一个投票。但是不要让我推广不正确的答案。因为你的答案更正确,而且你莫名其妙地把它记下来了,所以我把我的答案改成了你的答案。只需注意,“不提升”并不一定意味着积极否决投票。我会修改我的答案,或者在你的评论之后把它记下来。你的最后一句话是一个常见的错误信息。Find知道文件名的起始位置和结束位置。就其本身而言,它对空格、换行符和其他有趣的东西没有任何问题。因此`-exec gzip{}`使用一个文件名调用gzip,并且由于没有调用中间shell(可能会将空白解释为分隔符),gzip将接收整个文件名。find手册页中的提示似乎过时了,这意味着:您的shell可以在将{}传递给find之前尝试解释它,但是没有看到这样的shell。如何:“find.-type f-print0 | xargs-0r gzip”?不需要真正排除.gz文件,因为gzip将它们单独保留:“gzip:foo.gz已经有了.gz后缀--unchanged”
find-类型f-print0 | xargs-0r gzip也可以很好地工作,但效率稍低,因为它启动了一个新的shell,处理的文件比需要的多(即.gz文件),并生成可以避免的输出。另一方面,如果您想查看
find
考虑的所有文件,这是一个很好的方法。像大多数任务一样,有很多方法可以实现这一点,每种方法都有其优点和缺点。这不是最好的答案吗…?gzip-r-k-9./这确实是最优雅的答案。谢谢你。