引数を使用して複数のディレクトリでbashスクリプトを実行するには? [コピー]

引数を使用して複数のディレクトリでbashスクリプトを実行するには? [コピー]

シェルスクリプトとフォルダツリーがありますが、app1.sh各フォルダ内でこのシェルを実行する方法がわかりません。これはapp1.shスクリプト

スクリプトは文字列、整数、およびファイルをジョブパラメータとして受け取ります。アイデアは、ディレクトリ内の4つのフォルダで実行することです。

助けてくれてありがとう :)

答え1

(追加の説明がないため、質問のタイトルの「引数」を無視してください。)スクリプトがapp1.sh現在のディレクトリにあり、現在のディレクトリ内のすべてのディレクトリとサブディレクトリでこのスクリプトを実行するとします。

shopt -s globstar nullglob dotglob

runme=$PWD/app1.sh

for folder in ./**/; do
    ( cd "$folder" && "$runme" )
done

**ワイルドカードモード(シェルオプションで有効)を使用してglobstarすべてのディレクトリを見つけます。その後、これらのディレクトリを繰り返し、cd各ディレクトリのディレクトリ変更を使用して、そのディレクトリを現在の作業ディレクトリとして使用してスクリプトを実行します。

サブディレクトリではなく最上位ディレクトリのみを処理するには、削除しますglobdot./**/./*/

nullglobパターンが一致しない場合(ディレクトリなし)、ループをまったく実行しないようにシェルオプションが設定され、隠されたディレクトリも一致するようにシェルdotglobオプションが設定されます。

ループ本体の周りの括弧は、コマンドをサブシェルで囲みます。現在の作業ディレクトリはサブシェルに対してローカルなので、cdスクリプトを実行した後に「再び終了」する必要はありません。


使用find:

runme=$PWD/app1.sh

find . -type d -exec sh -c '
    runme=$1; shift
    for folder do
        ( cd "$folder" && "$runme" )
    done' sh "$runme" {} +

これは同じことを行います(ほぼ;これはディレクトリへのシンボリックリンクをチェックしません。現在の目次)。見つかったディレクトリ配置の場合は、短いインラインシェルスクリプトを呼び出します。スクリプトは実行するスクリプトのパス名を選択し、残りの引数(見つかったディレクトリ)を繰り返し、そのディレクトリに変更してスクリプトを実行します。

サブディレクトリではなく最上位ディレクトリのみを処理するには、-maxdepth 1次のコマンドにテストを追加しますfind

find . -maxdepth 1 ...as before...

現在のディレクトリを処理したくない場合は、上記と同様にコマンドにまたは-mindepth 1を追加してください。別の方法は、現在のディレクトリ内のすべてのディレクトリを検索パスとして-name . -prune -o使用することです。ただし、次の場合、「パラメータのリストが多すぎます」エラーが原因で失敗します。find ./*/ ...数千現在のディレクトリ内のディレクトリ(これらの最上位ディレクトリが必要な場合-maxdepth 1でも変更する必要がありますが、正直なところ、この場合は通常のシェルループを使用します)。-maxdepth 0

-mindepth非標準テストですが、-maxdepth一般的に実装されています。

関連:

答え2

find以下を使用してこれを実行できます-type d

$ PWD=$(pwd); SCRIPT=/full/path/to/script.sh; find . -type d -exec bash -c "cd {}; $SCRIPT; cd $PWD" ";"

一度だけ使用すると-execdir避けられますcd $PWD

$ SCRIPT=/full/path/to/script.sh; find . -type d -execdir bash -c "cd {}; $SCRIPT" ";"

関連情報