【发布时间】:2013-04-26 23:57:49
【问题描述】:
我想在 Bash 中这样做:
- 在当前目录中,找到第一个名称中包含“foo”的文件夹
我一直在玩 find 命令,但有点困惑。有什么建议吗?
【问题讨论】:
-
可惜你想要 bash,zsh 让这样的事情变得更容易:
echo *(/[1])
我想在 Bash 中这样做:
我一直在玩 find 命令,但有点困惑。有什么建议吗?
【问题讨论】:
echo *(/[1])
您可以使用find 的-quit 选项:
find <dir> -maxdepth 1 -type d -name '*foo*' -print -quit
【讨论】:
awk 命令可以简化为awk NR==1,但最好使用head -n1。
head 的尝试。不知道为什么 awk 是我心中的第一个 :) ...
-quit 选项。
例如:
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'。
pattern="foo"
for _dir in *"${pattern}"*; do
[ -d "${_dir}" ] && dir="${_dir}" && break
done
echo "${dir}"
这比提供的其他 shell 解决方案要好,因为
${dir} 将为空)=~ 运算符(如果您需要这取决于您的模式)find)【讨论】:
$dir 只有在您的 shell 不将不匹配的 glob 视为文字字符串时才会为空。如果许多文件与该模式匹配,您可能会超出允许的最大参数数量。
_dir 和dir 之间的区别。而且我敢打赌,很少有目录有足够的子目录(而不是文件)来担心生成太多参数。
ARG_MAX(@chepner)的约束。更多信息here.