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.sh
4つのシェルスクリプトコピー(-P 4
)が並列に開始され(以前のコピーが完了するとすぐに新しいコピーが作成されます)、各コピーはファイル名を引数(-n 1
)として使用します。
つまり、スクリプトへのすべての呼び出しは次のようになります。
sh someFunction.sh segmentsomething
スクリプト内では、シェルは次の値を入力します。位置パラメータ(コマンドラインの引数)$1
などを入力します。$2
($0
通常はスクリプト自体の名前が含まれています)あなたの場合は$1
ファイル名が含まれ、残りは空です。
したがって、スクリプトは次のことを行います。
filename="$1"
echo "$filename"
cat "$filename"
それはすべてです。さて、一般的に、人々find
がファイルを見つけてファイル名を渡すとき、人々がxargs
互いに思い出させる不安定なファイル名の問題があります。
ユーティリティfind
には、スペースで区切られたファイル名が渡されます。ファイル名に空白が含まれている場合はお勧めできません。xargs
これは、正しい名前でスクリプトを呼び出す際に問題が発生する可能性があるためです。
したがって、最良の方法はいつも-print0
withfind
と-0
withを使用すると、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