あるコマンドから次のコマンドに引数を渡す

あるコマンドから次のコマンドに引数を渡す

手動で実行する2つの別々のコマンドを、cronを実行できるbashスクリプトに統合するスクリプトを作成しようとしています。

最初のコマンドは、特定の名前とサイズのファイルを簡単に検索することです。

find /some/path -type f -name file.pl -size +10M

これにより、一致する複数のファイルとフルパスが生成されます。次に、これらのパスを次のスクリプトの引数として for ループに手動でコピーします。

for path in /some/path/1/file.pl /some/path/2/file.pl /some/path/3/file.pl ; do perl /my/script.pl $path ; done

これを単一のシェルスクリプトに入れるのは簡単ですが、難しいです。

答え1

述語の用途は次のとおりです-exec

find /some/path -type f -name file.pl -size +10M -exec perl /my/script.pl {} \;

本当に欲しいならあなたの殻の出力に基づいてコマンドを実行して信頼性を維持するには、findコマンドはbash次のように/特定でなければなりません。zsh

  • zsh:

    IFS=$'\0'
    for f ($(find /some/path -type f -name file.pl -size +10M -print0)) {
      /my/script.pl $f
    }
    

    ではzsh簡単に次のことができます。

    for f (./**/file.pl(.LM+10)) /my/script.pl $f
    
  • bash/zsh

    while IFS= read -rd '' -u3 file; do
      /my/script.pl "$file"
    done 3< <(find /some/path -type f -name file.pl -size +10M -print0)
    

bashPOSIX シェルや他の POSIX シェルで実行する操作は、次のことを避けてください。

for file in $(find...)

または、少なくともフィールド区切り文字を改行で修正し、ワイルドカードを無効にして問題を軽減します。

IFS='
'; set -f; for file in $(find...)

(改行文字を含むファイルパスではまだ失敗します。)

答え2

GNUツールを使用している場合は、以下も機能します。

find /some/path -type f -name file.pl -size +10M -print0 | xargs -0 -n 1 -r perl /my/script.pl

説明する:

  • このオプションを使用-print0すると、GNU findはバイトを使用してファイル名を区別します\0\0バイトはファイル名の一部にできないため、ファイル名を一意に区別します。
  • このオプションは、GNU xargsに標準入力を--区切りファイル名のリスト-0として読み取るように指示します。\0
  • このオプションは、-n 11つ以上のファイル名がスクリプトに渡されることを強制します(スクリプトがファイルの完全なリストを引数として処理できる場合は無視してください)。
  • 最後に、-rファイル名が指定されていないとプログラムが実行されないようにする別のGNU拡張機能があります。

答え3

これはトリックを行う必要があります

for path in `find /some/path -type f -name file.pl -size +10M`; do perl /my/script.pl $path ;done

関連情報