Bash编程:获取给定目录的唯一子文件夹的名称

时间:2013-04-04 03:00:26

标签: 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的输出 - 一个永远不会解析其输出的实用程序。


它引起了我的共鸣,但这是尝试使用 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

2 个答案:

答案 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)

另请参阅:http://mywiki.wooledge.org/ParsingLs