パイプラインでコマンドを実行する

パイプラインでコマンドを実行する

次のことができない理由を理解する必要があります。

ls -d /data/VT60000* | xargs -IDIRECTORY find DIRECTORY -type f -iname RJ\*.xml | xargs -IFILE sh -c ' XML=$( xmlstarlet fo -D "FILE" );
EXTRACT=$( xmlstarlet sel -t -c "concat('JD',/root/item1,/root/item2)" <<< "$XML" );
echo '$EXTRACT'; '

何千ものXMLファイルを含む多くのフォルダがあります。このファイルから情報を抽出し、後で処理するために操作したいと思います。パイプする理由は、複数のプロセス(-P)を実行したいからです。

2番目のxmlstarletは実行されず、その理由を理解できません。

問題は、これをどのように達成できるかということです。 $EXTRACTから値を取得します。

事前に助けてくれてありがとう。

ベストアンサー1

ここで主な問題は、XMLfromというシェル内で変数を割り当てますxargsが、基本スクリプトで変数を使用しようとしていることです。子プロセスは親シェルに直接変数を渡すことができないため、これは機能しません。

代わりに、値を印刷するか、同じシェルで使用する必要があります。

スクリプトを見ると、次のようなことをしたいようです。

xmlstarlet fo -D "FILE" | xmlstarlet sel -t -c "concat('JD',/root/item1,/root/item2)"

またはsh -c

sh -c 'xmlstarlet fo -D "FILE" | xmlstarlet sel -t -c "concat('\''JD'\'',/root/item1,/root/item2)"'

しかし、引用は悪いので、他のスクリプトや変数(文字列のみ、または配列の全項目)に入れることをお勧めします。

xmlstarletまた、複数回呼び出される場合は、最初の行の出力で何をしたいのかわかりません。


ls /data/VT60000* | xargs問題のあるファイル名の問題を回避するために代替を使用できますprintf "%s\0" * | xargs -0

おすすめ記事