Linuxコマンド–ディレクトリをループする
1. 概要
特定のフォルダ内のすべてのディレクトリをループしたい場合があります。 たとえば、すべてのディレクトリを反復処理し、各フォルダで特定のコマンドを実行したい場合があります。
このチュートリアルでは、 Linuxコマンドを使用して、特定のフォルダー内のディレクトリのみをループする方法を確認します。 この例ではBashシェルを使用しますが、これらのコマンドは他のPOSIXシェルでも機能する可能性があります。
2. 基本的なforループ
Bashが提供する基本的なループ構造の1つから始めましょう。 簡単に要約すると、forループは反復ステートメントとして分類されます。 文字列のリストを入力として受け取り、特定の条件に達するか、リストの最後に到達するまで、アイテムごとにコードを繰り返し実行できるようにします。
基本的なforループ構造を理解したので、次のサブセクションでは、ディレクトリをループする2つの異なる方法について説明します。
2.1. パターンマッチングディレクトリのみ
for loop への入力として、ワイルドカードパターンを使用して複数のファイルを照合することから始めます。
for dir in */; do
echo "$dir"
done
上記の例で行っていることをさらに詳しく説明しましょう。
- すべてのファイルに一致する標準のワイルドカードグロブパターン「*」を使用します。 後で「/」を追加すると、ディレクトリのみが一致します
- 次に、各ディレクトリを変数dirの値に割り当てます。
- この簡単な例では、doとdoneの間でechoコマンドを実行して、変数dirの値を出力します。
次に、一番上に戻り、リスト内の次のディレクトリを取得して、リストの最後に到達するまで繰り返します。
エレガントではありますが、このソリューションには1つの欠点があることに注意してください。 現在のフォルダに少なくとも1つのディレクトリが使用可能であると想定しています。 ディレクトリが存在しない場合、ループは1回実行され、「*/」が出力されます。これは望ましくない場合があります。
次の例では、これに対抗するための解決策を示します。
2.2. ディレクトリファイルテストオペレータの使用
次に、ファイルテスト演算子のいずれかを使用して、リスト内のファイルアイテムがディレクトリであるかどうかを判断する方法を確認します。
for file in *; do
if [ -d "$file" ]; then
echo "$file"
fi
done
この例では、現在のディレクトリ内のすべてのファイルをループします。 次に、標準のifステートメントを使用して、ファイル変数が-dフラグを使用してディレクトリであるかどうかをテストできます。
この条件がtrueを返す場合、echoコマンドを使用してfileの値を出力するだけです。
3. findコマンドの使用
このセクションでは、 find コマンドを使用して、現在のフォルダー内のディレクトリのリストを出力する方法を説明します。
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
コマンドを正しく理解するために、コマンドをさらに詳しく見てみましょう。
- ‘。’で始まります。 これは、現在のディレクトリを表すために使用されます
- maxdepth パラメーターは、開始点から下降するディレクトリーのレベルを表します。
- 次に、値1の mindepth パラメーターを使用して、開始点を除くすべてのファイルを処理します。これは、「。」を意味します。 結果には含まれません。
- タイプのdパラメータは、ディレクトリのみを含めるために使用されます
- 最後に、 printf を使用して、フォルダーの名前と、結果ごとに新しい行のみを出力します。
この例は簡単なデモンストレーションとして機能しますが、実際には、ディレクトリの名前を出力するだけでは不十分です。 次のセクションでは、上記のバリエーションを見ていきます。
4. findとwhile readループを組み合わせる
この最後から2番目の例では、前のセクションで行ったようにfindコマンドを使用する方法を示しますが、今回は while read ループと組み合わせて、見つかった各ディレクトリに対してコマンドを実行します。
for ループの例のように、フォルダーの名前をエコーするだけです。
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
echo "$dir"
done
この例では、 printf パラメーターを使用してフォルダー名を出力する代わりに、各結果をwhileループにパイプします。 各ディレクトリの値をdirという変数に割り当ててから、この変数の値を単にechoします。
5. findおよびexecパラメーターの使用
この最後の例では、見つかったディレクトリごとにコマンドを実行するための、ほぼ間違いなくよりエレガントで簡潔なソリューションを検討します。
前の例のように、フォルダーの名前をエコーするだけですが、今回は-execパラメーターを使用します。
find . -maxdepth 1 -type d -exec echo {} \;
-execアクションを使用して、選択したファイルに対して指定されたコマンドを実行できます。 この例では、echoは{}を見つかったファイル名に置き換えます。 エスケープされたコマンドの最後の部分’;’ 単に、ファイルごとに1つのechoコマンドが実行されることを意味します。
6. 結論
このクイックチュートリアルでは、ディレクトリをループするのに役立ついくつかの方法について説明しました。
最初に、標準のファイルパターンワイルドカードを使用して、基本的なforループを調べました。 その後、ディレクトリファイルテストを追加しました。 次に、findコマンドを使用して同様の結果を達成する方法を示しました。
いつものように、記事の完全なソースコードは、GitHubでから入手できます。