我只想做一件簡單的事情。我有以下目錄中的文件:爲什麼rm不按我期望的那樣工作?
AppInterface.h baa PEMsg.h PluginInterface.h
然後我發出命令:
ls | grep -v ".h" | rm -rf
令我失望的是,baa
沒有被刪除。但是,這個:
ls | grep -v ".h"
給出baa
正如我所料。所以我想問題是如何rm
需要輸入,但我不知道爲什麼。在csh和bash中嘗試了這一點。
我只想做一件簡單的事情。我有以下目錄中的文件:爲什麼rm不按我期望的那樣工作?
AppInterface.h baa PEMsg.h PluginInterface.h
然後我發出命令:
ls | grep -v ".h" | rm -rf
令我失望的是,baa
沒有被刪除。但是,這個:
ls | grep -v ".h"
給出baa
正如我所料。所以我想問題是如何rm
需要輸入,但我不知道爲什麼。在csh和bash中嘗試了這一點。
RM並不需要從標準輸入,所以你無法將文件列表傳送給它。
你需要
rm `ls | grep -v ".h"`
或
ls | grep -v ".h" | xargs rm -rf
你想用xargs:
ls | grep -v ".h" | xargs rm -rf
rm
不從標準輸入取得它的參數。什麼,你可能尋找的是命令替換(這裏的反引號表示),其中一個命令的結果可以被插入到另一個論據:
rm -rf `ls | grep -v ".h"`
rm
不讀取從標準輸入文件的列表,這就是爲什麼它不工作。您不能將文件名列表傳送到rm
。
正確的方式做,這將是
find . -maxdepth 1 -not -name '*.h' -exec rm -rf {} +
使用多功能find效用。如果你認爲這看起來有很多工作:那就是正確性的代價。但是,真的,一旦你熟悉發現,情況並不會太糟糕。
`rm`從那時開始輸入什麼內容?爲什麼區別? – nakiya 2010-12-06 10:58:32
Rm僅從命令行獲取要刪除的文件列表。反引號``版本執行ls和grep,並將命令行中的輸出替換爲rm。 xargs從stdin獲取輸入,並將輸入作爲命令行參數調用命令(本例中爲rm -rf)。當需要處理大量輸入時,xargs會更好,或者在輸入傳遞給命令之前需要對輸入進行復雜處理。 – 2010-12-06 11:15:22