
我有一個奇怪的問題參數。
我有一個參數即使當我回顯該命令時,它也能完美地工作。我的一班班輪如下:
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 exifprintformat
僅exiftool
列印檔名, - 僅選擇
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
有幾處錯誤,以及不必要的複雜性:-
- 雙重
xargs
呼叫意味著第二個呼叫看到單行輸入,因此{}
僅用包含所有符合檔案名稱的單一字串替換一次,但echo
在輸出中不會顯示這種差異(echo a b
與相比echo "a b"
)。 - argument
-0
表示輸入參數之間xargs
需要有一個 null ('\0'
) 字符,但實際上沒有;這也強制將輸入視為單一參數。 - 透過在條件匹配時僅輸出檔案名,您可以每行獲得一個檔案名,可以直接透過管道傳輸到該檔案名,
xargs
而不需要grep
或sed
。 - 不幸的是,
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 刪除了所有空格)。