我有一个文件夹,其中包含一些目录和一些文件(有些是隐藏的,以点开头)。
for d in *; do
echo $d
done
将循环遍历所有文件和目录,但我只想循环遍历目录。我怎么做?
答案1
您可以在末尾指定斜杠以仅匹配目录:
for d in */ ; do
echo "$d"
done
如果要排除符号链接,请使用continue
循环测试当前条目是否为链接。您需要从名称中删除尾部斜杠,以便能够-L
将其识别为符号链接:
for d in */ ; do
[ -L "${d%/}" ] && continue
echo "$d"
done
答案2
答案3
请注意,choroba 的解决方案虽然很优雅,但如果当前目录中没有可用的目录,则可能会引发意外行为。在这种状态下,bash 不会跳过for
循环,而是只运行一次循环,其中d
等于*/
:
#!/usr/bin/env bash
for d in */; do
# Will print */ if no directories are available
echo "$d"
done
我建议使用以下方法来防止这种情况:
#!/usr/bin/env bash
for f in *; do
if [ -d "$f" ]; then
# Will not run if no directories are available
echo "$f"
fi
done
此代码将循环遍历当前目录中的所有文件,检查是否f
是目录,f
如果条件返回 true,则回显。如果f
等于*/
,echo "$f"
则不执行。
答案4
您可以使用纯 bash 来实现此目的,但最好使用 find:
find . -maxdepth 1 -type d -exec echo {} \;
(另外查找将包括隐藏目录)