【问题标题】:Use bash to find first folder name that contains a string使用 bash 查找包含字符串的第一个文件夹名称
【发布时间】:2013-04-26 23:57:49
【问题描述】:

我想在 Bash 中这样做:

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

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

【问题讨论】:

  • 可惜你想要 bash,zsh 让这样的事情变得更容易:echo *(/[1])

标签: bash shell find


【解决方案1】:

您可以使用find-quit 选项:

find <dir> -maxdepth 1 -type d -name '*foo*' -print -quit

【讨论】:

  • awk 命令可以简化为awk NR==1,但最好使用head -n1
  • 谢谢!我也更喜欢head 的尝试。不知道为什么 awk 是我心中的第一个 :) ...
  • 我们怎样才能得到最后一个而不是第一个?
  • 在 MacOS 上,我得到非法选项 m,(来自 -maxdepth 选项)=> $ find -maxdepth 1 -type d -name 'foo'| head -n1 查找:非法选项--m 用法:查找[-H | -L | -P] [-EXdsx] [-f 路径] 路径 ... [表达式] 查找 [-H | -L | -P] [-EXdsx] -f 路径 [路径 ...] [表达式]
  • @AlexanderMills 谢谢,您在 MacOS/BSD 上是对的,路径参数是强制性的。使用 GNU find 时可以省略它。答案已经很老了,今天我推荐-quit 选项。
【解决方案2】:

例如:

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

或(有关更好的 shell 解决方案,请参阅 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"

根据@hek2mgl 评论编辑head -n1

接下来基于@chepner 的 cmets

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

dir1=$(find . -name \*foo\* -type d -maxdepth 1 -print -quit)

【讨论】:

  • 这两个看起来都很棒,谢谢!但是如何将完整的文件夹名称存储在变量中?
  • 如果变量中有foo,请在find 命令中尝试... -name "*$variable*" ...
  • 如果目录中有文件夹,但没有一个真正匹配foo...则您的第二个解决方案将不起作用...然后$dir1 将设置为找到的最后一个目录。
  • 如果你的find 支持它,-quit after -print 将导致find 在找到第一个文件后退出。同样,grep -m1 'foo' 将仅输出其输入中第一次出现的 'foo'。
  • 在这种情况下(-print -quit)它也可以处理带有换行符的文件名,并且可能比 shell 方法更快。这方式比使用 head 或 grep 更优雅。
【解决方案3】:
pattern="foo"
for _dir in *"${pattern}"*; do
    [ -d "${_dir}" ] && dir="${_dir}" && break
done
echo "${dir}"

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

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

【讨论】:

  • $dir 只有在您的 shell 不将不匹配的 glob 视为文字字符串时才会为空。如果许多文件与该模式匹配,您可能会超出允许的最大参数数量。
  • @chepner 我认为您需要再次阅读我的代码。文字字符串将设置为 $_dir,但不是 $dir,因为测试将评估为 false。
  • 啊,是的,我没有注意到_dirdir 之间的区别。而且我敢打赌,很少有目录有足够的子目录(而不是文件)来担心生成太多参数。
  • 感谢所有贡献的人。很好的讨论
  • 由于随机投票而回来,并想补充一点,这ARG_MAX(@chepner)的约束。更多信息here.
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2014-05-25
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多