Xargs
為什麼 xargs 可以使用某些命令而不能使用其他命令?
我可以執行這個命令並且它可以工作:
find . -type f -print0 | xargs md5sum
這將列印每個文件的 md5sum。
但是對於其他命令,它似乎將所有文件傳遞給命令的單個呼叫。例如,兩者
printf
似乎echo
都有這個問題。隨著printf
我得到這個警告:printf: warning: ignoring excess arguments, starting with ...
而使用 echo 它只列印一行,例如,如果我有這個命令:
find . -type f -print0 | xargs -r0 echo GOT
我只看到列印了一次“GOT”,與找到的所有文件在同一行。
我想可能是因為 echo 也是一個內置函式,但是如果我顯式執行 /bin/echo,我會得到相同的行為。
作為參考,我什至在製造的命令中遇到了這個問題:
$ echo "a b c" | xargs echo GOT GOT a b c
代替:
GOT a GOT b GOT c
我究竟做錯了什麼?首先通過在命令前加上前綴來調試命令對我很有幫助,
echo
但我什至無法做到這一點。編輯:正如評論中提到的,我實際上無法使用該
-exec
選項find
,實際上我的管道更長一些,包括排序,但這似乎是一個無關緊要的細節,與我無法獲得的事實無關更簡單的管道甚至可以工作。
您可以將其
xargs command-arg
視為執行單個實例的命令,command-arg
它從標準輸入中獲得的所有內容由某個分隔符(預設為空格或您在範例中使用的 NUL 字節)分隔。例如:echo 1 2 3 | xargs something
會跑
something 1 2 3
。或使用您在問題中發布的範例:echo "a b c" | xargs echo GOT
執行
echo GOT a b c
。如果您想使用從標準輸入中獲得的每個參數 xargs 派生一個新的 command-arg 實例,您可以使用 -n1 選項:
$ echo "a b c" | xargs -n1 echo GOT GOT a GOT b GOT c
當然請注意,某些命令不接受多個參數,因此必須始終使用
-n1
.使用 xargs 的優點是生成一個新程序是一項昂貴的操作,因此使用多個參數執行單個程序會更快,請檢查我在此答案中所做的一些基準測試 https://unix.stackexchange.com/a/536023/72304