Linuxコマンド–ディレクトリをループする

1. 概要

特定のフォルダ内のすべてのディレクトリをループしたい場合があります。 たとえば、*すべてのディレクトリを反復処理し、各フォルダで特定のコマンドを実行したい場合があります*。
このチュートリアルでは、* Linuxコマンドを使用して特定のフォルダー内のディレクトリのみをループする方法を確認します*。 この例ではhttps://en.wikipedia.org/wiki/Bash_(Unix_shell)[Bash]シェルを使用しますが、これらのコマンドは他のPOSIXシェルでも機能する場合があります。

2. 基本的な_for_ループ

Bashが提供する基本的なループ構造の1つから始めましょう。 *簡単に要約すると、http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_01.html [_for_]ループは反復ステートメントとして分類されています*。 入力として文字列のリストを受け取り、特定の条件に達するかリストの最後に到達するまで、各項目に対してコードを繰り返し実行できます。
次のサブセクションでは、基本的な_for_ループ構造を理解したので、ディレクトリをループする2つの異なる方法を説明します。

* 2.1。 パターンマッチングディレクトリのみ*

*まず、ワイルドカードパターンを使用して、複数のファイルを_for_ループへの入力として照合します*:
for dir in */; do
    echo "$dir"
done
上記の例で行っていることをさらに詳しく説明しましょう。
  • すべてのファイルに一致する標準のワイルドカードグロブパターン「*」を使用します。
    後に「/」を追加すると、ディレクトリのみが一致します

  • 次に、各ディレクトリを変数dirの値に割り当てます

  • 簡単な例では、次に
    _http://man7.org/linux/man-pages/man1/echo.1.html [echo] _コマンドを使用して、変数_dir_の値を単純に出力します。

    次に、先頭に戻り、リスト内の次のディレクトリを取得し、リストの最後に到達するまで繰り返します。
    エレガントですが、このソリューションには1つの欠点があることに注意してください。 現在のフォルダーに少なくとも1つのディレクトリが存在することを前提としています。 *ディレクトリが存在しない場合、ループは1回実行され、**が出力されますが、これは望ましくない場合があります。*
    次の例では、これに対処する解決策を示します。

* 2.2。 ディレクトリファイルテストオペレータの使用*

*ここで、http://www.tldp.org/LDP/abs/html/fto.html [ファイルテスト演算子]のいずれかを使用して、リスト内のファイル項目がディレクトリ:*
for file in *; do
    if [ -d "$file" ]; then
        echo "$file"
    fi
done
この例では、現在のディレクトリ内のすべてのファイルをループします。 *次に、標準のhttp://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html[_if_]ステートメントを使用して、_file_変数が_-d_ flag __.__ *を使用するディレクトリかどうかをテストできます。
この条件が_true_を返す場合、_echo_コマンドを使用して_file_の値を出力するだけです。

3. _find_コマンドの使用

*このセクションでは、http://man7.org/linux/man-pages/man1/find.1.html [_find_]コマンドを使用して、現在のディレクトリ内のディレクトリのリストを印刷する方法を説明します。フォルダ:*
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
コマンドをより詳しく見て、適切に理解してみましょう。
  • 「。」で始まります現在のディレクトリを表すために使用されます

  • maxdepth parameterは、ディレクトリのレベルを表します
    出発点から降りる

  • 次に、_mindepth_パラメーターに値1を使用してすべてを処理します
    開始点以外のファイル–これは、「。」結果に含まれません。

  • _-type d_パラメータは、ディレクトリのみを含めるために使用されます

  • 最後に、_printf_を使用して、フォルダーの名前と新しい
    各結果の行。

    この例は簡単なデモンストレーションとして機能しますが、実際には、ディレクトリの名前を出力するだけでなく、おそらくそれ以上のことをしたいと考えています。 次のセクションでは、上記のバリエーションが表示されます。

4. _find_ループと_while read_ループの組み合わせ

この最後から2番目の例では、前のセクションで行ったようにfindコマンドを使用する方法がわかりますが、今回は_http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_02と組み合わせます。 html [while] read_ループは、見つかった各ディレクトリに対してコマンドを実行します。
_for_ループの例に従って、単にフォルダーの名前をエコーし​​ます。
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
  echo "$dir"
done
この例では、_printf_パラメーターを使用してフォルダー名を出力する代わりに、*各結果をwhileループにパイプします*。 各ディレクトリの値を_dir_という変数に割り当ててから、この変数の値を単純に_echo_割り当てます。

5. _find_および_exec_パラメーターの使用

この最後の例では、見つかった各ディレクトリに対してコマンドを実行するための、おそらくよりエレガントで簡潔なソリューションを検討します。
前の例に従って、*フォルダーの名前を単に_echo_しますが、今回は_-exec_パラメーターを使用します*:
find . -maxdepth 1 -type d -exec echo {} \;
  • _-exec_アクションを使用して、選択したファイルに対して指定されたコマンドを実行できます*。 この例では、_echo_は\ {}を見つかったファイル名に置き換えます。 エスケープされたコマンドの最後の部分。単に、各ファイルに対して単一の_echo_コマンドが実行されることを意味します。

6. 結論

このクイックチュートリアルでは、ディレクトリをループするのに役立ついくつかの方法を説明しました。
最初に、標準のファイルパターンワイルドカードを使用して、基本的な_for_ループを調べました。 後で、ディレクトリファイルテストを追加しました。 次に、_find_コマンドを使用して同様の結果を達成する方法を示しました。
いつものように、記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/linux-bash/loops[GitHubで]から入手できます。