【问题标题】:Special use of linux find command together with ziplinux find命令与zip一起特殊使用
【发布时间】:2017-01-19 16:31:25
【问题描述】:

想象一下这样的文件夹结构:

  • /411/folder1/
  • /411/存档/
  • /211/存档/
  • /211/folder1/
  • /211/folder2/

在每个子文件夹中都会有文件和更多带有文件/文件夹的子文件夹。我有兴趣压缩名为“存档”的子文件夹中的所有文件,并忽略结构中的所有其他文件夹。

如果我使用命令:find * -type d -name 'archive'

输出会是这样的:

  • 928/存档
  • 973/存档
  • 990/存档

我感兴趣的是输出如下:

  • 928/archive/file1.jpg
  • 928/archive/file2.jpg
  • 928/archive/folder1/file3.jpg

等等以便我可以使用指挥官:find * -type d -name 'archive' [with some more/other options] | zip all_archive_files.zip -@

如何做到这一点?

【问题讨论】:

  • 澄清一下,您想要一个包含所有档案内容的 zip 文件吗?

标签: linux shell


【解决方案1】:

您可以使用-pathregex 匹配整个路径:例如

find . -regex './[0-9]+/archive/.*' -type f -exec zip all.zip {} \;

【讨论】:

    【解决方案2】:

    这很粗略,但你可以:

    find . -type d -name 'archive' -exec find {} \; | zip stuff.zip -@
    

    【讨论】:

    • 有一个(不常见的)警告:包含换行符的文件名将不起作用。
    • 警告 - 好的,但为什么并不少见?在大约 40 年的编程生涯中,我不记得遇到过这样的情况,有人会不小心创建一个带有嵌入换行符的文件名。当然,这种情况可能发生,人们应该意识到这种可能性,但我认为这是一种非常罕见的情况。
    • 我说警告本身很常见,而不是带有换行符的文件名。换句话说,像这样编写明显但有细微错误的脚本是非常普遍的。
    【解决方案3】:

    运行zip 的正常方式从命令行获取文件名,并使用-r 标志,该命令将自行递归到目录中。考虑

    find . -name 'archive' -type d -exec zip -r all_archive_files.zip {} +
    

    -exec 选项将运行zip -r all_archive_files.zip ...,其中... 将替换为find 找到的所有文件的列表。在-execzip 之间使用echo 运行它,看看它会做什么:

    $ find . -name 'archive' -type d
    411/archive
    412/archive
    488/archive
    512/archive
    $ find . -name 'archive' -type d -exec echo zip -r all_archive_files.zip {} +
    zip -r all_archive_files.zip 411/archive 412/archive 488/archive 512/archive
    

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 2011-08-26
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      相关资源
      最近更新 更多