一部のディレクトリと一部のファイル(一部は非表示でドットで始まる)を含むフォルダがあります。
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 {} \;
(さらに検索には隠しディレクトリも含まれます)