私には2つの問題があります。引数としてパイプを介してファイルを渡そうとしていますが、そのファイルをsh
関数内の変数として使用しようとしています。
これが私のコマンドです:
find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
ここで、私の行は「segment.something
」のように見えるすべてのファイルを見つけて、それをパイプの右側に渡します。 someFunction.sh
では、引数としてファイルの名前が必要です。 segment1
に入力されているファイルを考えてみましょう。
someFunction.sh
は、(たとえば)segment1
のすべての行を出力します。
パイプの左側から右側に出力を渡すにはどうすればよいですか?それからsomeFunction.sh
内でそれを呼び出すにはどうすればよいですか?
あなたの命令
$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
someFunction.sh
シェルスクリプトの最大4つのコピーが並行して開始(-P 4
)されるという効果があります(古いものが完了するとすぐに新しいものが生成されます)、それぞれが1つのファイル名を取得しますその引数として(-n 1
)。
これは、スクリプトの各呼び出しが次のようになることを意味します
sh someFunction.sh segmentsomething
スクリプト内で、シェルは位置パラメーター(コマンドラインの引数)の値を$1
、$2
などに配置します(通常は$0
スクリプト自体の名前が含まれています)。あなたの場合、$1
にはファイルの名前が含まれ、その他は空になります。
したがって、スクリプトでは:
filename="$1"
echo "$filename"
cat "$filename"
それだけです。さて、通常、find
を使用してファイルを検索し、そのファイル名をxargs
に渡すと、人々がお互いに思い出しがちな風変わりなファイル名の問題が発生します。ここでそれを行います。あまりにも。
find
ユーティリティは、空白で区切られたファイル名を渡します。スペースを含むファイル名がある場合、xargs
が適切な名前でスクリプトを呼び出すのに問題が発生するため、これは適切ではありません。
したがって、常に-print0
をfind
で使用し、-0
をxargs
で使用することをお勧めします。これは、ファイル名ではなく、スペースで区切られ、nul
文字(\0
)で区切られます。これにより、はるかに安全になります。
したがって:
$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh
someFunction.sh
が作業ディレクトリにあると仮定すると、このようなものを使用できます。
find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh
-print0
および-0
は、名前にスペースが含まれるファイルを許可します(一般的な問題)。私のsomeFunction.sh
には
#!/bin/bash
echo "Arg: " $1
cat $1
これは単にファイル名をエコーアウトしてから、someFunction.sh
に渡されたファイルの内容を書き込みます。