次の形式の複数のディレクトリがあります。
my_dir/subdir*/qsub.sh
各サブディレクトリのすべてのエントリを実行したいがqsub.sh
実行しようとすると
sh my_dir/subdir*/qsub.sh
qsub.sh
単一のサブディレクトリに対してのみ実行されるようです。なぜこのようなことをするのですか?
答え1
コマンドが機能しない理由は、シェルが最初の一致を実行し、残りの一致が最初のスクリプトに引数として渡されるためです。
ディレクトリを繰り返し、各スクリプトを個別に実行する必要があります。
例えば
for script in my_dir/subdir*/qsub.sh ; do
sh "${script}"
done
答え2
bxmがすでに述べたように、シェルは次のコマンドを拡張します。
sh my_dir/subdirA/qsub.sh my_dir/subdirB/qsub.sh my_dir/subdirC/qsub.sh
my_dir/subdirA/qsub.s
パラメータとして実行されます。my_dir/subdirB/qsub.sh
my_dir/subdirC/qsub.sh
forループの代替は次のとおりです。
find my_dir -name qsub.sh -exec sh '{}' \;
初心者のための拡張ヒント:
すべてのスクリプトを実行可能にし(chmod +x
)、適切なshebangで始めます(たとえば#!/usr/bin/env sh
)。その後、スクリプトを実行可能にしてアクティブにすることができ、実行ロジックを変更することなくPython、Perl、またはバイナリなどの他のスクリプト言語を使用することもできます。
次に検索を実行します。
find my_dir -type f -executable -name qsub.sh -exec '{}' \;
確認する人々が見つけたシンボリックリンクの処理方法や検索の深さを制御するオプションです。