パイプを介して入力ファイルを引数として渡しますか?

パイプを介して入力ファイルを引数として渡しますか?

2つの質問があります。パイプを介してファイルをパラメータとして渡そうとし、そのファイルをsh関数内で変数として使用しようとしています。

これは私のコマンドです:

find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

ここで私の行は、 ""のように見えるすべてのファイルを見つけて、segment.somethingパイプの右側に渡すことです。では、someFunction.shファイル名がパラメータとして必要です。ファイルをインポートしているとしますsegment1

someFunction.sh(たとえば)の各行を印刷します。segment1

パイプの左から右に出力を渡す方法と内部で呼び出す方法は何ですかsomeFunction.sh

答え1

注文

$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

その結果、最大someFunction.sh4つのシェルスクリプトコピー(-P 4)が並列に開始され(以前のコピーが完了するとすぐに新しいコピーが作成されます)、各コピーはファイル名を引数(-n 1)として使用します。

つまり、スクリプトへのすべての呼び出しは次のようになります。

sh someFunction.sh segmentsomething

スクリプト内では、シェルは次の値を入力します。位置パラメータ(コマンドラインの引数)$1などを入力します。$2$0通常はスクリプト自体の名前が含まれています)あなたの場合は$1ファイル名が含まれ、残りは空です。

したがって、スクリプトは次のことを行います。

filename="$1"

echo "$filename"
cat "$filename"

それはすべてです。さて、一般的に、人々findがファイルを見つけてファイル名を渡すとき、人々がxargs互いに思い出させる不安定なファイル名の問題があります。

ユーティリティfindには、スペースで区切られたファイル名が渡されます。ファイル名に空白が含まれている場合はお勧めできません。xargsこれは、正しい名前でスクリプトを呼び出す際に問題が発生する可能性があるためです。

したがって、最良の方法はいつも-print0withfind-0withを使用すると、xargsファイル名はスペースではなくnul文字(\0)で区切られます。これにより、より安全になります。

したがって:

$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh

答え2

someFunction.sh作業ディレクトリで次のものを使用できるとします。

find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh 

名前にスペースを含むファイルを許可します(FAQ)-print0-0私の中にはsomeFunction.sh私がいます。

#!/bin/bash
echo "Arg: " $1  
cat $1

ファイル名をエコーし​​、渡されたファイルの内容を書き込みます。someFunction.sh

関連情報