すべてのサブフォルダでコマンドを実行する方法

すべてのサブフォルダでコマンドを実行する方法

一連のサブフォルダ(たとえばaz)があり、各サブフォルダ(たとえば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   

関連情報