next up previous
Next: 一個 process 要怎樣偵測出自己是否在背景狀態執行? Up: 中級的問題 Previous: 我要如何改變一個 symbolic link 的 permission 呢?

我要如何 "undelete" 一個檔案?

某年某月的某一天,要刪除 "*.foo" 卻一不小心打成了 "rm * .foo", 結果發現竟把 "*" 都刪除了。真的是欲哭無淚啊!可是你也只好把這當成 是成長的代價了。

當然一個稱職的系統管理員應當會定期做備份。先問一問你的系統管理員看 你不小心刪除的檔案是不是有備份起來。如果沒有的話,嗯,繼續往下看吧!

不管你是不是真的要刪除一個檔案,當你下了 "rm" 以後,檔案就不見了。 在你 "rm" 一個檔案,系統就不再記得你的檔案是用了硬碟中的哪些 block 了。更糟糕的是,當系統要用到更多的硬碟空間時,就優先取用這些剛放出 來的 block。不過天底下沒有不可能的事。理論上說,若你在下了 "rm" 後, 馬上把系統 shutdown,資料是就得回來的。不過,你得找一個對系統非常 熟悉且肯花費數小時至數天的時間來幫你做這件事的專家才行。 當你不小心 "rm" 了一個檔案後,第一個反應或許是為什麼不用一個 alias 或在 sh 中的 function 將 "rm" 取代掉,當你下 "rm" 只把檔案搬到一個 垃圾桶之類的地方呢?那如果不小心殺錯檔案就可以挽救,只是要定期清一 清垃圾桶就好了。有兩個理由。第一,大多數的人不認為這是一個好的做法。 這麼做的話你會太依賴你的 "rm",有一天到了一個正常的系統中把正常的  "rm" 當成你的 "rm" 來用,那可能會死得很慘。第二,你會發現你花費了 許多不必要的時間在處理垃圾桶裡的東西。所以對一個初學者而言呢,用  "rm" 的  -i選項應該就夠了。

如果你有大無畏的精神的話,那好吧,就給你個簡單的答案。寫一個名為  "can" 的指令,功用是將檔案移到垃圾桶裡。在 csh(1) 中,將以下的東西 放進 ".login" 裡:

        alias can       'mv \!* ~/.trashcan'       # junk file(s) to trashcan
        alias mtcan     'rm -f ~/.trashcan/*'      # irretrievably empty trash
        if ( ! -d ~/.trashcan ) mkdir ~/.trashcan  # ensure trashcan exists
如果你想要每次 logout 時都把垃圾桶清乾淨,那就把
        rm -f ~/.trashcan/*

進 ".logout" 裡。若你用的是 sh 或是 ksh,那自己試試著寫寫看吧!

MIT 的雅典娜計畫作出了一套有  delete/undelete/expunge/purge 的軟體。這套軟體可以完全取代 "rm" 而又提供 undelete 的功能。這個軟體曾 post 在 comp.sources.misc (volume 17, issue 023-025)。



Tan Koan-Sin
1999-03-02