回答:
ディレクトリのみに一致するように、最後にスラッシュを指定できます。
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
$ dがシンボリックリンクかどうかをテストできます。
set -P
です。ディレクトリを変更するコマンドにのみ影響します。sprunge.us/TNac
[[ -L "$f" ]]
この場合、symlinksを除外しません。*/
末尾のスラッシュを削除する必要があります[[ -L "${f%/}" ]]
(末尾のスラッシュを含むリンクのテストを参照)
chorobaのソリューションは、エレガントではありますが、現在のディレクトリ内にディレクトリがない場合、予期しない動作を引き起こす可能性があることに注意してください。この状態ではfor
、bashはループをスキップするのではなく、次のd
値に等しいループを1回だけ実行します*/
。
#!/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
このコードは、現在のディレクトリ内のすべてのファイルをループし、ディレクトリであるかどうかを確認し、条件がtrueを返す場合にf
エコーしf
ます。f
がに等しい場合*/
、echo $f
実行されません。
shopt -s nullglob
。
ディレクトリだけが使用するよりも特定のファイルを選択し、それfind
を渡す必要がある場合while read
:
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
shopt -u dotglob
隠しディレクトリ(またはzshのsetopt dotglob
/ unsetopt dotglob
)を除外するために使用します。
IFS=
のいずれかを含むファイル名の分割を避けるため$IFS
に、例えば:'a b'
その他のオプションについては、AsymLabsの回答を参照してくださいfind
編集:
whileループ内から終了値を作成する必要がある場合は、このトリックによって余分なサブシェルを回避できます。
while IFS= read -r d; do
if [ "$d" == "something" ]; then exit 1; fi
done < <(find * -prune -type d)
そのために純粋なbashを使用できますが、findを使用する方が適切です。
find . -maxdepth 1 -type d -exec echo {} \;
(findには追加で隠しディレクトリが含まれます)
shopt -s dotglob
for bash
を使用して、隠しディレクトリを含めることができます。あなたも含まれます.
。また、これ-maxdepth
は標準オプション(-prune
is)ではないことに注意してください。
dotglob
オプションは興味深いですがdotglob
、の使用にのみ適用されます*
。find .
常に隠しディレクトリ(および現在のディレクトリ)が含まれます
これは、現在の作業ディレクトリ内で、ルートディレクトリを除く、可視ディレクトリと非表示ディレクトリの両方を見つけるために行われます。
ディレクトリをループするだけ:
find -path './*' -prune -type d
結果にシンボリックリンクを含めるには:
find -L -path './*' -prune -type d
各ディレクトリに対して何かを行うには(シンボリックリンクを除く):
find -path './*' -prune -type d -print0 | xargs -0 <cmds>
隠しディレクトリを除外するには:
find -path './[^.]*' -prune -type d
返された値に対して複数のコマンドを実行するには(非常に不自然な例):
find -path './[^.]*' -prune -type d -print0 | xargs -0 -I '{}' sh -c \
"printf 'first: %-40s' '{}'; printf 'second: %s\n' '{}'"
「sh -c」の代わりに「bash -c」なども使用できます。
... -print0 | xargs -0 ...
正確な名前がわからない場合に使用することをお勧めします。
find * | while read file; do ...
次のコマンドを使用すると、隠しディレクトリ(ドットで始まる)を含むすべてのディレクトリを1行と複数のコマンドでループできます。
for file in */ .*/ ; do echo "$file is a directory"; done
シンボリックリンクを除外する場合:
for file in *; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
注記:リストを使用すると、*/ .*/
bashで動作しますが、また、フォルダが表示されます.
し、..
zshの中で、それはこれらを示すが、フォルダには隠しファイルが存在しない場合、エラーがスローされませんしながら、
隠しディレクトリを含み、.. /を除外するよりクリーンなバージョンには、dotglobオプションがあります。
shopt -s dotglob
for file in */ ; do echo "$file is a directory"; done
(またはsetopt dotglob
zshで)
でドットグロブを解除できます
shopt -u dotglob
これには、リスト内の各ディレクトリの完全なパスが含まれます。
for i in $(find $PWD -maxdepth 1 -type d); do echo $i; done
ls -l | grep ^d
または:
ll | grep ^d
エイリアスとして設定できます
ls
これは、ディレクトリをリストするこのベースの回答とは少し異なります。
ls
:mywiki.wooledge.org/ParsingLs