
一連のサブフォルダ(たとえばa
〜z
)があり、各サブフォルダ(たとえばdsmmigrate * &
)でコマンドを実行したい場合はどうすればよいですか。手動方式は、
cd a
dsmmigrate * &
cd ../b
これはあまりにも複雑に見えるので、より簡単な方法があると確信しています。
答え1
はい、作業ディレクトリを前後に変更するのは面倒で、実際にやりたいことではありません。注意しない限り、より複雑なスクリプトで非常に奇妙な状況が発生する可能性があるためです。
単純なコマンドの作業ディレクトリを変更する一般的な方法は、cd
コマンドと呼び出しをサブシェルに配置することです。サブシェルの作業ディレクトリは変更されますが、サブシェルは独自の環境で実行されるため、変更はスクリプトの残りの部分に渡されません。
例:mycommand
現在の作業ディレクトリ内のすべてのディレクトリで実行します。
for d in *; do
if [ -d "$d" ]; then # or: if test -d "$d"; then
( cd "$d" && mycommand )
fi
done
または、あなたの場合は既知のディレクトリを使用して、a
次の手順を実行しますb
。
for d in a b; do
( cd "$d" && dsmmigrate * & )
done
私がツールを知らないので、このようにdsmmigrate
実行するのが正しいかどうかはわかりません。
編集する:それが明らかになったdsmmigrate
ツールフラグがあります-Recursive
:
$ dsmmigrate -Recursive /path
答え2
現在のディレクトリが:parent_directory
の場合は、次の操作を実行できます。
for d in [a-z]
do
( cd $d && your-command-here )
done
メインスクリプトの現在のディレクトリが変更されないようにサブシェルを(
作成します。)
答え3
サブフォルダに複数のジョブを送信する方法は次のとおりです。
for d in */; do ( cd "$d" && yourcommand ) ; done