Shell脚本以递归方式列出包含具有特定扩展名的文件的文件夹中的所有子目录

时间:2014-06-02 09:37:22

标签: linux bash shell sh

我有一个名为a的文件夹,它可能有一个或多个子目录,子目录可能有多个子目录,依此类推。我想知道如何编写shell脚本来列出包含具有特定扩展名的文件的所有子目录。

所以,它可能就像

A -> B -> C

  -> D -> f2.txt

       -> F -> f3.txt

  -> E -> G -> H -> f4.txt

因此只列出D,F和H目录。实际上我需要通过列出它们的目录树来快速查找特定java类的包名。例如,在前面的示例中,A.E.G.H是与A.D相同的包,但A.E.G不是包,因为G只包含子目录H没有文件。

3 个答案:

答案 0 :(得分:3)

我认为你需要find命令。你可以这样使用,

find . -name '*.txt'

下面,

. - dot(.)是当前目录。您还可以指定开始的路径。

-name - 要查找的文件名。

您还可以使用-maxdepth选项来限制递归查找的深度。通常,find会递归地找到该文件。

<强>更新

如果要列出目录,

find . -name '*.txt' -exec dirname {} \;

答案 1 :(得分:1)

find . -name '*.txt' -printf '%h\n'

man find会为-printf

提供其他可用的格式标记

答案 2 :(得分:0)

MAC等系统的更简单,更快速的替代方案。无需使用其他2个工具,甚至可以重复调用dirname

find -type f -name '*.txt' | awk 'BEGIN{FS=OFS="/"}{--NF}!a[$0]++'

-type f如果不起作用,可以选择删除。