forループで各ディレクトリを繰り返す正しい方法は何ですか? [コピー]

forループで各ディレクトリを繰り返す正しい方法は何ですか? [コピー]

たとえば、この for ループでは

for var in ?????
do
    dummy command
done

私は現在存在するディレクトリ内のすべてのディレクトリを繰り返すことができますが、これは不明なディレクトリのリストなので、疑問符がある場所に各ディレクトリを書き込むことはできません。助けてくれてありがとう。

答え1

最も簡単なのは、お客様の要件を満たすことです。」現在私がいるディレクトリのすべてのディレクトリを繰り返します。"、ワイルドカードのみを使用してください。

for d in */
do
    dummy_command "$d"
done

コマンドが末尾のスラッシュを処理できない場合$dに置き換えることができます。"$d""${d%/}"

コマンドが複数の引数を受け入れることができる場合は、ループをまったく繰り返す必要はありません。

dummy_command */

dummy_commandテストの例は簡単ですecho

気づくすべての場合にパターンが一致しない場合は、*/文字通りアスタリスクとスラッシュでコマンドに渡されます。これはほとんど確かにあなたが望むものではありません。

ループの上にこの行を追加すると問題を解決できますが、bashその時点から適用されることに注意してください。

shopt -s nullglob    # Expand unmatched wildcards to "nothing"

...相手が起こるshopt -u nullglobかスクリプトが終わるまで

答え2

最小/最大深度などの項目をさらに制御するには、whileループでfindを使用できます。

while IFS= read -r dir; do
    echo "$dir"
done < <(find . -type d)

その後、必要に応じてルックアップオプションを変更できます。スペースを含むディレクトリ名を探すのと同じようにできます。find . -type d -name '* *'

答え3

次のように(ファイル名にスペースを含むディレクトリを繰り返し一覧表示します):

shopt -s globstar
dummy_command **/*' '*/

またはforループの使用に固執する場合:

shopt -s globstar
for dir in **/*' '*/
    dummy_command "$dir"
done

関連情報