2010-12-06 125 views
3

我只想做一件簡單的事情。我有以下目錄中的文件:爲什麼rm不按我期望的那樣工作?

AppInterface.h baa PEMsg.h PluginInterface.h 

然後我發出命令:

ls | grep -v ".h" | rm -rf 

令我失望的是,baa沒有被刪除。但是,這個:

ls | grep -v ".h" 

給出baa正如我所料。所以我想問題是如何rm需要輸入,但我不知道爲什麼。在csh和bash中嘗試了這一點。

回答

8

RM並不需要從標準輸入,所以你無法將文件列表傳送給它。

你需要

rm `ls | grep -v ".h"` 

ls | grep -v ".h" | xargs rm -rf 
+0

`rm`從那時開始輸入什麼內容?爲什麼區別? – nakiya 2010-12-06 10:58:32

+2

Rm僅從命令行獲取要刪除的文件列表。反引號``版本執行ls和grep,並將命令行中的輸出替換爲rm。 xargs從stdin獲取輸入,並將輸入作爲命令行參數調用命令(本例中爲rm -rf)。當需要處理大量輸入時,xargs會更好,或者在輸入傳遞給命令之前需要對輸入進行復雜處理。 – 2010-12-06 11:15:22

4

你想用xargs

ls | grep -v ".h" | xargs rm -rf 
1

rm不從標準輸入取得它的參數。什麼,你可能尋找的是命令替換(這裏的反引號表示),其中一個命令的結果可以被插入到另一個論據:

rm -rf `ls | grep -v ".h"` 
2

rm不讀取從標準輸入文件的列表,這就是爲什麼它不工作。您不能將文件名列表傳送到rm

正確的方式做,這將是

find . -maxdepth 1 -not -name '*.h' -exec rm -rf {} + 

使用多功能find效用。如果你認爲這看起來有很多工作:那就是正確性的代價。但是,真的,一旦你熟悉發現,情況並不會太糟糕。

相關問題