Xargs

為什麼 xargs 可以使用某些命令而不能使用其他命令?

  • August 22, 2021

我可以執行這個命令並且它可以工作:

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

引用自:https://unix.stackexchange.com/questions/665700