在bash中,我想获取a
的唯一子文件夹的名称:
cd /tmp; mkdir -p a/b; v=$(ls -1 a); echo "$v"
输出:
b
这就是我想要的。
这很有效,因为我知道 a
内只有一个且只有一个子文件夹。
在我的场景中,请随意假设这种情况得到保证。
我感到不安的是,这项建议来自 Bash pitfalls
In addition to this, the use of ls is just plain unnecessary.
It's an external command whose output is intended specifically
to be read by a human, not parsed by a script.
这更令人生畏和宝石(来自上面的链接):
解析ls的输出 - 一个永远不会解析其输出的实用程序。
它引起了我的共鸣,但这是尝试使用bash globbing,obv。不起作用:
cd /tmp; mkdir -p a/b; v=a/*; echo "$v"
输出:
a/*
悲伤。
那么,如何为变量赋值获得 globbing ?
我想我知道如何在分配之外利用 globbing 。
for d in a/*; do echo "$(basename $d)"; done
输出:
b
“正确答案”(TM)。
你能否告诉我如何做到这一点并解释其背后的原理,拜托?
**注意:我不喜欢这个命令的输出:**
cd /tmp; w='name with blanks'; mkdir -p "$w/b"; v=$(echo "$w"/*); echo "$v"
是:
name with blanks/b
我想得到:
b
之后我必须使用basename
,还是可以直接获得b
?
答案 0 :(得分:3)
v=$(cd a;echo *)
通配符在命令替换中扩展,echo
将输出它,以便在分配中使用它。
cd
将允许您在不调用basename
的情况下获取基本名称。
答案 1 :(得分:3)
我很确定我写过这个陷阱的句子。无论如何......你的失败是因为大括号扩展,整数和分词不适用于标量分配。
printf -v v %s */
一个鲜为人知的技巧只能使用coreutils printf(1)
(假设有多个目录)。
v=$(LC_COLLATE=C; /usr/bin/printf '%s\c' */)
或者,这可能最接近您所追求的(GNU查找):
v=$(find . -maxdepth 1 -type d -name '[^.]?*' -printf %f -quit)