というディレクトリの下には、特定のタスクを実行したいa
サブフォルダがたくさんあります。誰もが同じです。次のことを行いますが、最初のサブディレクトリでのみ機能します。
for i in "a/*"
do
#echo $i
cd $i
mkdir test
mv *_no test
touch aaa
cd ..
done
上記のコードを使いたいですa
。
答え1
最初のcd
chdirは最初のディレクトリ(2つのレベルのサブディレクトリ)に移動します。cd
1つのレベルだけが戻ってきたので、その後は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
引用符を削除する必要があります。それ以外の場合、glob
sは拡張されません。
だから:
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