2016年11月28日 星期一

[Shell] 為什麼 pipe (重新導向) 的結果不能用在 rm??

原文 「Linux why can't I pipe find result to rm?」。


之前也有同樣的疑惑,為什麼在 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  

覺得這篇真的很不錯,留個記錄!