如何使用 Bash 回显包含匹配文件的目录?
Posted
技术标签:
【中文标题】如何使用 Bash 回显包含匹配文件的目录?【英文标题】:How to echo directories containing matching file with Bash? 【发布时间】:2011-01-17 23:15:06 【问题描述】:我想编写一个 bash 脚本,该脚本将使用包含特定文件的所有目录的列表。我可以使用find
来回显每个匹配文件的路径。我只想列出包含至少一个匹配文件的目录的路径。
例如,给定以下目录结构:
dir1/
matches1
matches2
dir2/
no-match
该命令(寻找'matches*'
)只会输出dir1
的路径。
作为额外的背景,我使用它来查找每个包含 Java .class 文件的目录。
【问题讨论】:
【参考方案1】:find . -name '*.class' -printf '%h\n' | sort -u
来自man find
:
-printf
格式
%h
文件名的前导目录(除了最后一个元素)。如果文件名不包含斜杠(因为它在当前目录中),%h
说明符将扩展为"."
。
【讨论】:
很好,谢谢。对于复制粘贴:find
在find
之后还需要一个目录,例如find . -name '*.class' -printf '%h\n' | sort -u
从当前目录搜索【参考方案2】:
在 OS X 和 FreeBSD 上,使用 find
和 lacks the -printf
option,这将起作用:
find . -name *.class -print0 | xargs -0 -n1 dirname | sort --unique
xargs
中的 -n1
将每次调用 dirname
时从标准输入中获取的最大参数数设置为 1
【讨论】:
在 OSX 上,您可以使用自制软件安装 gnu find:brew install findutils
并使用它:gfind . -name '*.class' -printf '%h\n'
【参考方案3】:
GNU 查找
find /root_path -type f -iname "*.class" -printf "%h\n" | sort -u
【讨论】:
【参考方案4】:好吧,我来得太晚了,但你也可以不找,专门回答“用 Bash 匹配文件”(或至少是 POSIX shell)。
ls */*.class | while read; do
echo $REPLY%/*
done | sort -u
$VARNAME%/*
将删除最后一个 /
之后的所有内容(如果您想删除第一个之后的所有内容,则应该是 $VARNAME%%/*
)。
问候。
【讨论】:
【参考方案5】:find / -name *.class -printf '%h\n' | sort --unique
【讨论】:
【参考方案6】:为时已晚,但这可能对未来的读者有所帮助: 我个人认为将文件夹列表打印到文件中而不是终端(在 Mac 上)更有帮助。 为此,您可以简单地将路径输出到文件,例如folder.txt,通过使用:
find . -name *.sql -print0 | xargs -0 -n1 dirname | sort --unique > folders.txt
【讨论】:
【参考方案7】:这个怎么样?
find dirs/ -name '*.class' -exec dirname '' \; | awk '!seen[$0]++'
对于awk
命令,请参阅此list 上的#43
【讨论】:
太棒了!不知道为什么之前没有人想到使用find
的exec
命令。以上是关于如何使用 Bash 回显包含匹配文件的目录?的主要内容,如果未能解决你的问题,请参考以下文章