無法使 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主題標籤中包含單字 DATA 的所有 pdf,
  • 指示-p exifprintformatexiftool列印檔名,
  • 僅選擇grep帶有 pdf 的行,
  • 刪除sed空格,
  • 當我運行時,第一個xarg將所有行變成一個字串,第二個構造綁定命令)

exiftool -p exifprintformat -if '$Subject =~/DATA/i' -q *.pdf |grep pdf |sed 's/ //g'|xargs|xargs -I{} echo pdftk {} cat 輸出binder1.pdf

我明白了

pdftk 20170105170516234.pdf 20170105173126944.pdf 20170105173209758.pdf 20170621163418079.pdf 貓輸出binder1.pdf

效果很好。

顯然,我做錯了什麼......但是什麼?

答案1

有幾處錯誤,以及不必要的複雜性:-

  1. 雙重xargs呼叫意味著第二個呼叫看到單行輸入,因此{}僅用包含所有符合檔案名稱的單一字串替換一次,但echo在輸出中不會顯示這種差異(echo a b與相比echo "a b")。
  2. argument-0表示輸入參數之間xargs需要有一個 null ( '\0') 字符,但實際上沒有;這也強制將輸入視為單一參數。
  3. 透過在條件匹配時僅輸出檔案名,您可以每行獲得一個檔案名,可以直接透過管道傳輸到該檔案名,xargs而不需要grepsed
  4. 不幸的是,xargs -I強制每行輸入一個命令,並且沒有添加尾隨參數的選項,但有一個簡單的解決方法:將尾隨參數添加到輸入流。

這是一個簡化的命令,添加了尾隨參數(我在不同的-if條件下進行了測試,沒有任何匹配的 PDF):-

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

xargs -d'\n'當檔案名稱嵌入空格時,該選項會使命令起作用。

答案2

xargs 的手冊頁顯示:

-I 替換-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 刪除了所有空格)。

相關內容