特别使用linux find命令和zip一起使用

时间:2017-01-19 16:31:26

标签: linux shell

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

  • / 411 / folder1 /
  • / 411 /存档/
  • / 211 /存档/
  • / 211 / folder1中/
  • / 211 /文件夹2 /

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

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

输出将如下:

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

我感兴趣的是输出如下:

  • 928 /存档/ file1.jpg
  • 928 /存档/ file2.jpg
  • 928 /存档/ folder1中/ file3.jpg

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

如何做到这一点?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这很粗糙,但你可以:

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

答案 2 :(得分:1)

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

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

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

$ 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