之前也有同樣的疑惑,為什麼在 shell 中使用 pipe ( | ) 得到的結果不能直接 rm。
原文中舉了個例子:
find . -name ".txt" -exec rm "{}" \;
這樣是可以的。find . -name ".txt" | grep a
這樣也可以。find . -name ".txt" | rm
但是這樣不行。為什麼?
下面的解釋大致上是說,因為 pipe 出來的結果是 stdin,但是 rm 後面接的是 command line 的參數(command line argument),會直接忽略 stdin。所以如果要 rm 用 pipe 出來的結果,要加 "xargs" (從 stdin 讀入並轉成 command line 參數)
舉例:
find . -name ".txt" | xargs rm
find . -name ".txt" | grep "foo" | xargs rm
覺得這篇真的很不錯,留個記錄!