递归查找一些“foo”并打包成tar文件。

3
考虑以下文件夹结构:
 root/dirA/the_folder
 root/dirA/dir2/the_folder
 root/dirB/the_folder
 root/dirB/dir2/the_folder

我希望能够递归查找并压缩 dirA/the_folderdirB/the_folder。然而,当我使用以下命令时:

find root/ -name 'the_folder' -type d | xargs tar cvf myTar.tar

它会打包所有包含dir2/the_folder的文件夹,我不想这样。有什么解决办法?
2个回答

3

使用find命令的-maxdepth选项来限制递归深度:

find root/ -maxdepth 2 -name 'the_folder' -type d

尝试使用man find命令,了解find提供的许多有用选项。你会惊讶的发现,例如,你可以使用find-exec选项来替代| xargs命令:

find root/ -maxdepth 2 -name 'the_folder' -type d -exec tar cvf myTar.tar {} +

3
在您的情况下,仅这样是否足够?
tar cfv mytar.tar root/*/the_folder/

1
更简单,同样有效。只是不够通用。但感谢你展示了我没有看到的森林中所有那些树木。;-) +1 - DevSolar
@DevSolar tar(至少是GNU版本)具有令人难以置信的过滤功能!与bash通配符一起使用,它几乎使find变得无用。 - gniourf_gniourf
@gniourf_gniourf:这更多是展示 [tag:Bash] 的 [tag:globbing],而不是 [tag:tar] 的过滤。 - johnsyweb
@Johnsyweb 谁说这展示了tar的过滤能力? :) 你是对的,这只是一个简单的 bash globbing! - gniourf_gniourf
@gniourf_gniourf:由于find可以用于许多其他上下文中,而不仅仅是为tar收集输入文件,因此说tar的选项可能会使find“几乎无用”有点过了。实际上,我认为相反:学习find的选项以满足您的通用“输入文件收集”需求比学习targrepsedbash globbing等选项更有效,但我理解您的观点。在这个特定的上下文中,您的解决方案优于我的解决方案。然而,我的解决方案可以*无论您打算如何处理所识别的文件都能够工作。;-) - DevSolar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接