2013-12-17 51 views
6

This question狀態:解讀RM ./-rf「絕招」

令人驚奇的是很多用戶並不瞭解rm ./-rfrm -- -rf技巧。

我害怕嘗試這些,但對他們做什麼感到好奇。他們也很難搜索...

有人能夠賜教嗎?

+2

「他們也很難搜索...「 - 是的,谷歌往往忽略所有標點符號。但是在另一個SO用戶創建的http://www.symbolhound.com上有一個專門用於標點符號的搜索引擎。搜索'rm - '的結果產生[這個問題](http://stackoverflow.com/questions/2928934/how-to-delete-file-from-svn)作爲第四個結果,其答案解釋了這兩種情況。 – l4mpi

回答

7

rm ./-rf和/或rm -- -rf會試圖刪除一個名爲,具體文件,-rf

唯一這裏是您通常不能刪除開頭的文件用「 - 」因爲命令會認爲它是一個命令參數。通過在完整路徑之前或使用--選項(即結束所有選項)前面的文件,命令將不再認爲它是一個參數。

應該指出的是,--版本的可能或可能無法正常工作與所有shell命令要麼,所以最好使用的第一個版本。

+1

shell不對命令參數做任何假設;它只是傳遞給他們。它是'rm'命令本身將'-rf'解釋爲控制選項而不是文件名。 –

+0

你是對的@JonathanLeffler,我已經更新了答案以澄清。 – Donovan

7

如果您的目錄中有一個名爲-rf的文件,如果您不知道該技巧,則很難刪除該文件。這是因爲:

rm -rf 

提供了兩個命令行選項(-r-f)作爲一個參數,並告訴rm遞歸和強行刪除的東西。

如果你寫:

rm ./-rf 

參數不以破折號更多的開始,所以這是一個簡單的文件名。同樣,通過普通的(但不是通用的)約定,--標誌着選項參數的結束,之後的任何事情都不再是一個選項(通常意味着它是一個文件名)。所以:

rm -- -rf 

刪除文件,因爲rm知道後面的--參數是文件名,而不是它處理的選項。

rm *rf* 

突然,這將刪除目錄以及文件(但不會損害文件-rf):

文件-rf如果使用通配符是更加危險。

+1

哇,'rm * rf *'確實不符合我的預期。通配符作爲選項!太可怕了! –

1

不是一個完整的答案,因爲我認爲其他答案給出了很好的解釋。

當我不能確定什麼給定rm調用時要刪除,我努力記住簡單ls文件列表第一,以確保它實際上是我想要刪除的內容:

 
$ ls -rf 
-rf .. . 
$ 

OK ,很明顯這是不對的,讓我們再試一次:

 
$ ls ./-rf 
./-rf 
$ 

這更好。讓我們做一個歷史更換lsrm -v-v只是額外的偏執/檢查),做實際刪除:

 
$ rm -v !!:* 
rm -v ./-rf 
removed `./-rf' 
$ 

這也與通配符,括號擴展等工作得很好,當你不知道什麼擴張將是完全的。


此外,如果你想知道怎麼樣-rf文件擺在首位生成,其驚人的容易,如果你陷入困境重定向一點:

 
$ ls 
$ echo > -rf 
$ ls 
-rf 
$