Rm

遞歸 rm 對我不起作用

  • August 7, 2015

假設我們在一個目錄中有以下文件:

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 as rm -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 上,你甚至可以使用tabkey 來自動完成。我使用zsh作為我的互動式 shell,因為我喜歡它的自動完成功能。

最後,rm(1)知道-i(在刪除之前以互動方式詢問您)。所以我會建議rm -i **/*~

順便說一句,如果您不了解版本控制系統,是時候學習它們了(我強烈建議使用git ….),尤其是對於“源”程式碼,如文件(C 或 Python 程序、shell 腳本等)等…),您將不需要備份文件。

引用自:https://unix.stackexchange.com/questions/220834