遞歸 rm 對我不起作用
假設我們在一個目錄中有以下文件:
test.txt test.txt~ /subdir test1.txt test1.txt~
當我
rm -r ./*.*~
在頂級目錄中執行時,只刪除了 test.txt~。儘管我使用了遞歸標誌,為什麼它不執行遞歸刪除?
您可以使用以下腳本重現我的案例:
#create dir and 1-st level test files mkdir dir cd dir touch test.txt touch test.txt~ #create subdir and 2-nd level test files mkdir subdir cd subdir/ touch test1.txt~ touch test1.txt cd .. rm -r ./*.*~
*.*~
不會擴展到任何目錄,它只會匹配目前目錄中的任何文件或目錄,.
其中某個地方有一個並以~
如果您想查找以
~
您所在目錄結尾的所有文件,我會find
使用find -type f -name '*~' -delete
您的
rm -r *.*~
(same asrm -r ./*.*~
) 將刪除匹配*.*~
的文件和目錄,即名稱包含點並以 a 結尾的文件和目錄~
但
subdir
不包含任何點,所以不適合。閱讀glob(7)並記住執行globbing
/bin/rm
的是您的 shell(而不是程序!)。所以發生的事情是你
rm -r ./*.*~
在你的 shell 中鍵入。您的外殼正在將其擴展為rm -r ./test.txt~
; 然後它/bin/rm
在你的程序中找到程序$PATH
,呼叫fork(2)創建一個子程序,然後在程序上執行execve(2)/bin/rm
,參數數組rm -rf ./test.txt~
sorm
甚至看不到./subdir
要刪除任何直接子目錄中的每個備份文件,請鍵入
rm */*.*~
; 使用最近的bash
(版本 4 或更高版本),zsh
您可以刪除任何備份文件,甚至可以在文件樹的深處使用rm **/*.*
了解 shell 正在做什麼的一種可能方法是將您的命令(例如
rm
)替換為echo
. 那應該會給您擴展(但請閱讀echo(1),因為echo
了解某些選項,例如-n
)。在一些好的 shell 上,你甚至可以使用tab
key 來自動完成。我使用zsh作為我的互動式 shell,因為我喜歡它的自動完成功能。最後,rm(1)知道
-i
(在刪除之前以互動方式詢問您)。所以我會建議rm -i **/*~
順便說一句,如果您不了解版本控制系統,是時候學習它們了(我強烈建議使用git ….),尤其是對於“源”程式碼,如文件(C 或 Python 程序、shell 腳本等)等…),您將不需要備份文件。