如何使用Bash回显包含匹配文件的目录?

时间:2010-02-17 17:00:53

标签: bash shell command-line find grep

我想编写一个bash脚本,它将使用包含特定文件的所有目录的列表。我可以使用find来回显每个匹配文件的路径。我只想列出包含至少一个匹配文件的目录的路径。

例如,给定以下目录结构:

dir1/
    matches1
    matches2
dir2/
    no-match

命令(查找'matches*')仅输出dir1的路径。

作为额外的背景,我使用它来查找包含Java .class文件的每个目录。

7 个答案:

答案 0 :(得分:58)

find -name '*.class' -printf '%h\n' | sort -u

来自man find

  

-printf 格式

     

%h文件名的前导目录(除最后一个元素外)。如果文件名不包含斜杠(因为它在当前目录中),%h说明符将扩展为"."

答案 1 :(得分:26)

OS X FreeBSD 上,使用find lacks the -printf option,这将有效:

find . -name *.class -print0 | xargs -0 -n1 dirname | sort --unique

-n1中的xargsdirname的每次调用从标准输入中获取的最大参数数设置为1

答案 2 :(得分:7)

GNU find

find /root_path -type f -iname "*.class" -printf "%h\n" | sort -u

答案 3 :(得分:3)

好的,我来得太晚了,但是你也可以在没有找到的情况下做到这一点,专门回答"匹配文件与Bash" (或至少是POSIX shell)。

ls */*.class | while read; do
  echo ${REPLY%/*}
done | sort -u

${VARNAME%/*}会删除最后一个/后的所有内容(如果您想在第一个之后删除所有内容,那将是${VARNAME%%/*})。

问候。

答案 4 :(得分:1)

find / -name *.class -printf '%h\n' | sort --unique

答案 5 :(得分:1)

为时已晚,但这对未来的读者可能会有所帮助: 我个人觉得将文件夹列表打印到文件而不是终端(在Mac上)更有帮助。 为此,您只需将路径输出到文件,例如folders.txt,使用:

find . -name *.sql -print0 | xargs -0 -n1 dirname | sort --unique > folders.txt

答案 6 :(得分:0)

这个怎么样?

find dirs/ -name '*.class' -exec dirname '{}' \; | awk '!seen[$0]++'

有关 awk 命令,请参阅此 list 上的 #43