forループのコードがbashシェルの最初のディレクトリでのみ実行されるのはなぜですか?

forループのコードがbashシェルの最初のディレクトリでのみ実行されるのはなぜですか?

というディレクトリの下には、特定のタスクを実行したいaサブフォルダがたくさんあります。誰もが同じです。次のことを行いますが、最初のサブディレクトリでのみ機能します。

for i in "a/*"
    do
            #echo $i
            cd $i
            mkdir test
            mv *_no test
            touch aaa
            cd ..
    done

上記のコードを使いたいですa

答え1

最初のcdchdirは最初のディレクトリ(2つのレベルのサブディレクトリ)に移動します。cd1つのレベルだけが戻ってきたので、その後は2番目のレベルに進むことはできません。つまり、始まった場所に戻りません。しかし、それにもかかわらず、まだ「a / *」という1つの値を繰り返しています。

この内容を引用したため、拡張されません。

しかし、周囲に引用符を入れることを忘れたので、$iその時点では引数に拡張されますcd

コードには他の多くの問題があります。

改善のためのいくつかの提案:

for i in a/*/; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done

答え2

sを使用するときは、glob引用符を削除する必要があります。それ以外の場合、globsは拡張されません。

だから:

for i in a/*

答え3

ループ内で$ iを参照すると、a/*/すでに単語に展開されているため、何もしません。たとえば、a/*/a / My Documents /に展開する場合は、最初のループ$i = a/Myと2番目のループで$i = Documents/ 次のことを試してください。

find . -maxdepth 1 -type d | while read i; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done

関連情報