*.vtu
我的意思是在 bash 中对给定目录下所有深度的所有文件进行 gzip 压缩。我在下面的深度 1 和 2 中有这样的文件./
。我设法做到了
$ gzip -v $(find . -name "*.vtu")
我还可以使用find ... -exec
, 和其他组合(见下文)。
有没有办法只使用 gzip 的功能来做到这一点(-r
是我的候选人)?
我期望
$ gzip -r -v "*.vtu"
其中模式不会被 shell 扩展,而是被扩展gzip
(并且以某种方式产生我的预期结果!),将适用于此,但我得到了gzip: ...: No such file or directory
我尝试过的所有组合。我发现的是以下内容:
- 使用
shopt -s globstar
(来自这里),该命令gzip -v **/*.vtu
似乎完全符合我的要求。 - 如果
shopt | grep globstar
给出globstar off
,则上面的命令不起作用。在本例中,我可以使用gzip -v */*.vtu
,但它仅适用于深度=1 的文件。同样,gzip -v */*/*.vtu
深度=2 时。
无论如何,我没有找到 flag 的效果/用处-r
。
有关的:
不,gzip 不能执行此操作,
-r
仅意味着“下降到子目录”,但没有“下降到子目录,然后查找与此 glob 匹配的文件”的选项。glob的扩展*.vtu
发生在grep
启动之前,并且由 shell not 处理grep
,因此grep
给出了特定的文件列表:*.vtu
当前目录中匹配的那些文件。所以是的,
globstar
这是你最好的选择。至于 的使用-r
,解释如下man gzip
:所以意味着“如果是一个目录,则
gzip -r foo
下降到并压缩其中的任何文件”。如果同时匹配文件和目录,例如,如果您在运行的目录中同时拥有和,那么 的内容也会被压缩。没有它,你会得到.foo
foo
foo
file.vtu
my.vtu/
gzip
my.vtu
my.vtu is a directory -- ignored
其他选项包括:
find . -name "*.vtu" -exec gzip {} +
压缩所有匹配的文件。gzip **/*.vtu
与globstar
集。find . -name "*.vtu" | xargs gzip
(只要你的名字正常并且不包含换行符)find . -name "*.vtu" -print0 | xargs -0 gzip
(如果您的文件名可以包含换行符)在terdon 回答之后,经过一番修改,我得出的结论是,
-r
工作方式如下:gzip
.gzip -r *
.对我来说,这非常奇怪(因此我从未想象过它是如何工作的)。例如,如果
./
我有命令
gzip -r -v *.vtk
将 gzip 除./foo
. 所有子目录(深度 = 1)和(深度 > 1)*.vtk
中的所有文件(不仅是)都将被ped。*.vtk
*
gzip
不是您问题的确切答案,但您可以使用
xargs
它,它允许您并行运行多个gzip
进程,例如*.vtk
,加引号,这样 shell 就不会扩展它xargs
-r
),则不要运行,因为 gzip 将使用 stdin-0
)gzip
每次调用使用一个文件名(-n1
)-P
),因为命令的输出nproc
显示我们有 CPUgzip
为每个输入运行命令