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
しれません)として明示的に言及することに注意してください。dash
bash
サブディレクトリが別のディレクトリにある場合:
for d in C2012A/*/ A1812A/*/ B8012B/*/; do
cp setphase.sh "$d"
sh "$d"/setphase.sh
done
要件に合わせてディレクトリ名を変更します。