web-dev-qa-db-ja.com

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

一連のサブフォルダー(aからzなど)があり、それぞれにコマンドを実行する場合(dsmmigrate * &など)、どのように実行しますか?手動のアプローチは、

cd a 
dsmmigrate * &
cd ../b

それは複雑すぎるようですので、もっと簡単なアプローチが必要だと思います。

5
SuperKing

はい、作業ディレクトリを前後に変更するのは面倒であり、注意しない限り、複雑なスクリプトで非常に奇妙な状況につながる可能性があるため、実際に実行したいことではありません。

単純なコマンドの作業ディレクトリを変更する通常の方法は、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ツールがわからないので、この方法で実行することが正しいかどうかはわかりません。

EDIT:dsmmigrate tool には-Recursive 国旗:

$ dsmmigrate -Recursive /path
4
Kusalananda

現在のディレクトリがparent_directoryの場合、次のことができます。

for d in [a-z]
do
    ( cd $d && your-command-here )
done

()はサブシェルを作成するため、メインスクリプトで現在のディレクトリが変更されることはありません。

3
Rahul