xargsコンストラクトを機能させることができません


0

xargsに奇妙な問題があります。
私が持っているxargsのを、私はコマンドをエコーするとき、それは完璧に動作していても、動作しない構造を。私のライナーは次のとおりです。

 exiftool -p exifprintformat  -if '$Subject =~/DATA/i' -q  *.pdf |grep pdf |sed 's/ //g'|xargs|xargs -0 -I % pdftk % cat output binder1.pdf  

そして出力

エラー:ファイルが見つかりません。エラー:PDFファイルを開けませんでした:20170105170516234.pdf 20170105173126944.pdf 20170105173209758.pdf 20170621163418079.pdf

  • exiftool対象タグのワードデータを含むすべてのPDFファイルを選択、
  • -p exifprintformat指示するexiftoolファイル名のみを印刷するには、
  • grep、pdfの行のみを選択します。
  • sed削除しの空白、
  • 最初xargはすべての行を1つの文字列に、2番目はbindコマンドを作成します)を実行すると

exiftool -p exifprintformat -if '$ Subject =〜/ DATA / i' -q * .pdf | grep pdf | sed 's / // g' | xargs | xargs -I {} echo pdftk {} cat出力バインダー1.pdf

私は得る

pdftk 20170105170516234.pdf 20170105173126944.pdf 20170105173209758.pdf 20170621163418079.pdf cat出力バインダー1.pdf

完璧に機能します。

明らかに、私は何か間違ったことをしています...しかし何ですか?


grep行末(おそらく存在)がdarfst -0予想され、NULバイト(おそらく欠落)が予想されます
-18:

回答:


0

いくつかの間違いがあり、不必要な複雑さがあります。

  1. 二重のxargsコールは、第二は、入力の一行を見て、そのことを意味し{}、すべての一致するファイル名を含む単一の文字列でちょうど1回置換されていますが、echo(比較出力の違いを示していないecho a becho "a b")。
  2. -0引数手段xargsヌル(必要'\0'入力引数の間)の文字を、そしてどれも存在しません。これにより、入力が単一のパラメーターとして扱われます。
  3. 条件が一致したときにファイル名のみを出力することにより、1行につき1つのファイル名を取得します。これはxargsgrepまたはを必要とせずに直接パイプできますsed
  4. 残念ながら、xargs -I入力の行ごとに1つのコマンドを強制し、末尾のパラメーターを追加するオプションはありませんが、単純な回避策があります:末尾のパラメーターを入力ストリームに追加します。

これは、末尾のパラメーターが追加された単純化されたコマンドです(異なる-if条件でテストしましたが、一致するPDFはありません):

{ exiftool -p '${FileName}' -if '$Subject =~/DATA/i' -q *.pdf; \
  echo -e "cat\noutput\nbinder1.pdf"; } | xargs -d'\n' pdftk

このxargs -d'\n'オプションにより、ファイル名に空白が埋め込まれている場合にコマンドが機能します。


exiftoolも...投げ出さする必要があるファイル名以外の2行印刷して精巧な答えのため、すべてのミスを特定するためのthnxは..発言なし3のためのいくつかの疑問を持っている
Grigoris L.

@GrigorisL。-私が言えることは、コマンドは私にとってはうまく機能し、exiftool引用したコマンドはファイル名を含む1行だけを生成するということです。記録のために私のexiftoolリビジョンは10.10で、Ubuntu 16.04を実行しています。
AFH

@ΑFH結局のところ、あなたはまったく正しいです。-p $ FileNameをbashから呼び出すと、ファイル名のみが出力されます。最初に行ったように、パラメータファイルから呼び出された場合、出力はより複雑になります。
グリゴリスL.

わかり${FileName}ましたが、ファイル内の唯一の行(コメント、ヘッダーなどなし)として配置しましたが、これも同様に機能しました。テストにはインライン文字列を使用しましたが、最終的なフォーマットは非常に単純だったため、別のファイルに配置しても意味がありませんでした。ちなみに、{}この場合はオプションです$FileName。単純なものは同等です。
AFH

0

xargsのmanページには次のように書かれています:

-私は-strを置き換えます

  Replace occurrences of replace-str in the initial-arguments with
  names read from standard input.   Also, unquoted blanks do not
  terminate input items; instead the separator is the newline
  character.  Implies -x and -L 1.

つまり、「20170105170516234.pdf 20170105173126944.pdf 20170105173209758.pdf 20170621163418079.pdf」という単一の引数で終わることになります

xargsを完全に捨てて、コマンドを次のように並べ替えることをお勧めします。

pdftk $(exiftool -p exifprintformat -if '$Subject =~/DATA/i' -q *.pdf |grep pdf |sed 's/ //g'| tr '\n' ' ') cat output binder1.pdf

これはすべて、ファイル名にスペースが含まれていないことを前提としています(とにかくsedですべてのスペースを削除していたため、安全な前提です)。


thnx!初心者として、この微妙な違い(引数と引数)を特定する必要がありました...初心者のahaの瞬間..私の以前の理解は、xargsがシェルまたは何かを呼び出してコマンドを実行することでした...明らかにそうではありません。 。
Grigoris L.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.