如何在 bash 中仅循环目录?

如何在 bash 中仅循环目录?

我有一个文件夹,其中包含一些目录和一些文件(有些是隐藏的,以点开头)。

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

您可以使用以下方法进行测试-d

for f in *; do
    if [ -d "$f" ]; then
        # $f is a directory
    fi
done

这是其中之一文件测试操作符

答案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 {} \;

(另外查找将包括隐藏目录)

相关内容