查找具有相同名称的所有目录中的子目录


9

我想运行一个命令:

  1. inc在文件夹“ X” 下找到名为“ ”的所有目录。
  2. 列出每个“ X/.../inc/” 下的所有子目录。
  3. 将输出重定向到名为“ list” 的文件

我尝试了以下命令的各种组合,但没有成功:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

我怎样才能做到这一点?

Answers:


14

find 可以自己完成这一切:

find X -path '*/inc/*' -type d > list

阅读-path部分内容以man find获取更多信息。

正如我在评论中快速提到的:如果将目录行存储在文本文件中,则包含换行符的目录名称将无法明确表示。如果您确定目录不包含换行符,那就没问题。只是一般性评论。


是啊。我在这里
王子

或者找到X
-name'inc'

@MaQleod:不,这不是问题。
Daniel Andersson

4

这是一个方便的单行:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

它运行find在每个第一个find结果上。该exec选项还可以采用最小的shell命令,其中 - 正如我所说 - {}被第一个命令的每个目录替换find

第二个find将根据您的请求“列出第一个结果的所有子目录”,包括inc目录。如果你不想在输出中使用它,那么让第二个find 至少输出深度为1的文件夹。

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

然后我们只需将命令重定向stdoutlist


这个答案的变化对我有帮助,我只想要原始比赛的深度1子目录 find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
核心

1

好吧,我找到了模拟这个嵌套查找的答案:

find X/ -type d | grep "/inc/" > list

很好,那也行得通!然而,在Unix / Linux上的贝壳,真的没有这样的事情答案。这是个人偏好和易于遵循的混合体。
Vishal Kotcherlakota

为了照顾的非常规(但现有的)文件名以如换行符:find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > listgrep -z也划上了空字符,但它的输出似乎是空分开为好,免得一会又需要把它管道例如xargs -0L1 echo通过线得到它线)。在这种情况下,由于您要将列表保存到文件中,并且每个条目都由换行符分隔,因此文件名中的换行符仍将模糊地表示。也许您根本不需要中间文件,具体取决于您要对列表执行的操作。
Daniel Andersson

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.