AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1508177
Accepted
sancho.s ReinstateMonicaCellio
sancho.s ReinstateMonicaCellio
Asked: 2024-03-21 21:42:35 +0800 CST2024-03-21 21:42:35 +0800 CST 2024-03-21 21:42:35 +0800 CST

如何让 gzip 在所有深度递归运行?

  • 772

*.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我尝试过的所有组合。我发现的是以下内容:

  1. 使用shopt -s globstar(来自这里),该命令gzip -v **/*.vtu似乎完全符合我的要求。
  2. 如果shopt | grep globstar给出globstar off,则上面的命令不起作用。在本例中,我可以使用gzip -v */*.vtu,但它仅适用于深度=1 的文件。同样,gzip -v */*/*.vtu深度=2 时。

无论如何,我没有找到 flag 的效果/用处-r。

有关的:

  1. gzip 所有具有特定扩展名的文件
  2. https://stackoverflow.com/questions/10363921/how-to-gzip-all-files-in-all-sub-directories-in-bash
command-line
  • 3 3 个回答
  • 548 Views

3 个回答

  • Voted
  1. Best Answer
    terdon
    2024-03-21T21:55:46+08:002024-03-21T21:55:46+08:00

    不,gzip 不能执行此操作,-r仅意味着“下降到子目录”,但没有“下降到子目录,然后查找与此 glob 匹配的文件”的选项。glob的扩展*.vtu发生在grep启动之前,并且由 shell not 处理grep,因此grep给出了特定的文件列表:*.vtu当前目录中匹配的那些文件。

    所以是的,globstar这是你最好的选择。至于 的使用-r,解释如下man gzip:

    -r --recursive
           Travel the directory structure recursively.  If any of the file
           names  specified on the command line are directories, gzip will
           descend into the directory and compress all the files it  finds
           there (or decompress them in the case of gunzip ).
    

    所以意味着“如果是一个目录,则gzip -r foo下降到并压缩其中的任何文件”。如果同时匹配文件和目录,例如,如果您在运行的目录中同时拥有和,那么 的内容也会被压缩。没有它,你会得到.foofoofoofile.vtumy.vtu/gzipmy.vtumy.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(如果您的文件名可以包含换行符)
    • 7
  2. sancho.s ReinstateMonicaCellio
    2024-03-21T23:25:10+08:002024-03-21T23:25:10+08:00

    在terdon 回答之后,经过一番修改,我得出的结论是,-r工作方式如下:

    1. 如果匹配的是一个文件(仅在当前目录中),则执行gzip.
    2. 如果匹配的是目录,则进入该目录,然后在该目录下执行gzip -r *.

    对我来说,这非常奇怪(因此我从未想象过它是如何工作的)。例如,如果./我有

    foo
    foo.vtk
    test.vtk/
    test.vtk/another.vtk/
    test.vtk/another.vtk/cake.vtk
    test.vtk/another.vtk/dow.txt
    test.vtk/cake.vtk
    test.vtk/dow.txt
    test.vtk/this/
    test.vtk/this/cake.vtk
    test.vtk/this/dow.txt
    

    命令gzip -r -v *.vtk将 gzip 除./foo. 所有子目录(深度 = 1)和(深度 > 1)*.vtk中的所有文件(不仅是)都将被ped。*.vtk*gzip

    • 2
  3. Simon Richter
    2024-03-22T16:42:05+08:002024-03-22T16:42:05+08:00

    不是您问题的确切答案,但您可以使用xargs它,它允许您并行运行多个gzip进程,例如

    find -name '*.vtk' -print0 | xargs -r0n1 -P$(nproc) gzip
    
    • 寻找文件
      • 匹配*.vtk,加引号,这样 shell 就不会扩展它
      • 打印由 NUL 字节分隔的文件名(以具有明确的分隔符)
    • 将文件列表提供给xargs
      • 如果列表为空 ( -r),则不要运行,因为 gzip 将使用 stdin
      • 使用 NUL 作为分隔符 ( -0)
      • gzip每次调用使用一个文件名( -n1)
      • 并行运行尽可能多的进程 ( -P),因为命令的输出nproc显示我们有 CPU
      • gzip为每个输入运行命令
    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve