60

我想在 Bash 中这样做:

  • 在当前目录中,找到名称中包含“foo”的第一个文件夹

我一直在玩 find 命令,但有点困惑。有什么建议么?

4

3 回答 3

91

您可以使用以下-quit选项find

find <dir> -maxdepth 1 -type d -name '*foo*' -print -quit
于 2013-05-02T17:47:29.230 回答
12
pattern="foo"
for _dir in *"${pattern}"*; do
    [ -d "${_dir}" ] && dir="${_dir}" && break
done
echo "${dir}"

这比提供的其他 shell 解决方案更好,因为

  • 对于大型目录,它会更快,因为该模式是 glob 的一部分,而不是在循环内检查
  • 当没有与您的模式匹配的目录时,实际上可以按预期工作(然后${dir}将为空)
  • 它可以在任何符合 POSIX 的 shell 中工作,因为它不依赖于=~操作员(如果你需要这取决于你的模式)
  • 它适用于名称中包含换行符的目录(vs. find
于 2013-05-02T19:31:41.207 回答
9

例如:

dir1=$(find . -name \*foo\* -type d -maxdepth 1 -print | head -n1)
echo "$dir1"

或(有关更好的外壳解决方案,请参阅 Adrian Frühwirth 的回答)

for dir1 in *
do
    [[ -d "$dir1" && "$dir1" =~ foo ]] && break
    dir1=        #fix based on comment
done
echo "$dir1"

或者

dir1=$(find . -type d -maxdepth 1 -print | grep 'foo' | head -n1)
echo "$dir1"

编辑 head -n1 基于@hek2mgl 评论

接下来基于@chepner 的评论

dir1=$(find . -type d -maxdepth 1 -print | grep -m1 'foo')

或者

dir1=$(find . -name \*foo\* -type d -maxdepth 1 -print -quit)
于 2013-05-02T17:48:03.010 回答