シェルスクリプトを複数のターゲットディレクトリにコピーして実行します。

シェルスクリプトを複数のターゲットディレクトリにコピーして実行します。

C201201A/RA/、C201202A/RB など、複数のディレクトリとサブディレクトリがあります。そのため、setphase.shをすべてのサブディレクトリにコピーして実行したいと思います。私は次のコードを試しました

#!/bin/bash
ls -d */*/ > folders.txt
no=1
while read folder
    do echo $folder
       cp setphase.sh $folder
       sh setphase.sh
       no=`expr $no + 1`
done < folders.txt

どこに書くべきですかsh setphase.sh

答え1

スクリプトが実際にディレクトリに存在する必要がない場合(非常に少数のスクリプトがあり、...あるスクリプトはほとんど間違って作成され、修正が必要です)オプションを使用してfind-execdirディレクトリでスクリプトを実行できます。たとえば、

find . -mindepth 2 -maxdepth 2 -type d -execdir /path/to/setphase.sh \;

GNUのfindマニュアルページから:

-execdir command ;

-execdir command {} +

に似ています-execが、指定されたコマンドは通常、起動したディレクトリではなく一致するファイルを含むサブディレクトリで実行されますfind

これは、一致するファイルへのパスを解析する際に競合状態を回避するため、コマンドを呼び出すより安全な方法です。

-execアクションと同様に、フォームは複数の一致するファイルを処理するコマンドラインを作成+-execdirますが、指定されたコマンド呼び出しは同じサブディレクトリに存在するファイルのみを一覧表示します。

このオプションを使用する場合は、$PATH環境変数が参照されないようにする必要があります.。それ以外の場合は、攻撃者が実行するディレクトリに適切な名前のファイルを残して、必要なコマンドを実行できます-execdir

$PATH の項目が空である場合、または絶対ディレクトリ名でない場合も同様です。呼び出しが終了状態としてゼロ以外の値を返す場合、ゼロ以外の終了find 状態が返されます。エラーが発生するとfindすぐに終了する可能性があるため、保留中の一部のコマンドがまったく実行されない可能性があります。

ジョブの結果は、ジョブが使用されているかバリアントが使用されているかによって異なります+。 true は常に返されますが、コマンドが 0 を返す場合にのみ true です。;-execdir command {} +-execdir command {} ;

答え2

C2012A/すべてのサブディレクトリがディレクトリ内にある場合は、cpスクリプトをサブディレクトリにコピーし、for次の構造を使用して実行できます。

for d in C2012A/*/; do
    cp setphase.sh "$d"
    sh "$d"/setphase.sh
done

スクリプトは実行位置に依存しないと仮定されます。

また、 を実行すると、スクリプトにある場合、shebangが何であるかに関係なく、sh setphase.shスクリプトの実行を引数(システムによって、または他のものかもshしれません)として明示的に言及することに注意してください。dashbash


サブディレクトリが別のディレクトリにある場合:

for d in C2012A/*/ A1812A/*/ B8012B/*/; do
    cp setphase.sh "$d"
    sh "$d"/setphase.sh
done

要件に合わせてディレクトリ名を変更します。

関連情報