使用bash查找包含字符串的第一个文件夹名称

dyl*_*zed 55 bash shell find

我想在Bash中这样做:

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

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

hek*_*mgl 86

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

find <dir> -maxdepth 1 -type d -name '*foo*' -print -quit
Run Code Online (Sandbox Code Playgroud)


Adr*_*rth 10

pattern="foo"
for _dir in *"${pattern}"*; do
    [ -d "${_dir}" ] && dir="${_dir}" && break
done
echo "${dir}"
Run Code Online (Sandbox Code Playgroud)

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

  • 对于大型目录来说会更快,因为模式是glob的一部分,而不是在循环中检查
  • 当没有与您的模式匹配的目录时,实际上按预期工作(然后${dir}将为空)
  • 它适用于任何符合POSIX标准的shell,因为它不依赖于=~运算符(如果需要,则取决于您的模式)
  • 它适用于名称中包含换行符的目录(vs. find)


jm6*_*666 8

例如:

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

或者(对于更好的shell解决方案,请参阅AdrianFrühwirth的答案)

for dir1 in *
do
    [[ -d "$dir1" && "$dir1" =~ foo ]] && break
    dir1=        #fix based on comment
done
echo "$dir1"
Run Code Online (Sandbox Code Playgroud)

要么

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

根据@ hek2mgl评论编辑了头-n1

接下来基于@Chepner的评论

dir1=$(find . -type d -maxdepth 1 -print | grep -m1 'foo')
Run Code Online (Sandbox Code Playgroud)

要么

dir1=$(find . -name \*foo\* -type d -maxdepth 1 -print -quit)
Run Code Online (Sandbox Code Playgroud)

  • 如果你的`find`支持它,``-print`之后的`-quit`*将导致`find`在找到第一个文件后退出.类似地,`grep -m1'foo'`将仅输出其输入中第一次出现的'foo'. (3认同)