如何使用 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 说明符将扩展为 "."

【讨论】:

很好,谢谢。对于复制粘贴:findfind 之后还需要一个目录,例如find . -name '*.class' -printf '%h\n' | sort -u从当前目录搜索【参考方案2】:

OS XFreeBSD 上,使用 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

【讨论】:

太棒了!不知道为什么之前没有人想到使用findexec 命令。

以上是关于如何使用 Bash 回显包含匹配文件的目录?的主要内容,如果未能解决你的问题,请参考以下文章

bash给csv文件添加一个表头

AWK/BASH:如何将一个文件中的字段与另一个文件中的字段匹配?

如何使 fputcsv “回显”数据

如何在bash脚本中回显浮点数,包括点前面的前导0

如何回显数学表达式的结果并将其保存到Bash中的变量中

使用 bash,如何从目录中的所有文件中创建类路径?