我想编写一个bash脚本,它将使用包含特定文件的所有目录的列表。我可以使用find
来回显每个匹配文件的路径。我只想列出包含至少一个匹配文件的目录的路径。
例如,给定以下目录结构:
dir1/
matches1
matches2
dir2/
no-match
命令(查找'matches*'
)仅输出dir1
的路径。
作为额外的背景,我使用它来查找包含Java .class文件的每个目录。
答案 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
中的xargs
将dirname
的每次调用从标准输入中获取的最大参数数设置为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