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

chorobの解決策は優れていますが、現在のディレクトリに利用可能なディレクトリがないと、予期しない動作が発生する可能性があります。この状態では、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 {} \;

(さらに検索には隠しディレクトリも含まれます)

関連情報