How do I "undelete" a file?


  


If of all words of tongue and pen, the saddest are, `It might have been,'
More sad are these we daily see: `It is, but hadn't ought to be.'
- Francis Brett Hart

Someday, you are going to accidentally type something like "rm * .foo," (a space in between '*' and '.foo') and suddenly realize that you just deleted "*" instead of "*.foo". Consider it a rite of passage.

Of course, any decent systems administrator should be doing regular backups. Check with your sysadmin to see if a recent backup copy of your file is available. But if it isn't, read on.

For all intents and purposes, when you delete a file with "rm" -- it is gone. Once you "rm" a file, the system totally forgets which blocks scattered around the disk were part of your file. Even worse, the blocks from the file you just deleted are going to be the first ones taken and scribbled upon when the system needs more disk space. However, never say never.

It is theoretically possible *if* you shut down the system immediately (don't even think about it!) after the "rm" to recover portions of the data. However, even in such case, you'd better have a very wizardly guru at hand with hours or days to spare to get it all back.

Your first reaction when you "rm" a file by mistake is why not make a shell alias or procedure which changes "rm" to move files into a trash bin rather than delete them? That way you can recover them if you make a mistake, and periodically clean out your trash bin.

However, two major points: First, this is generally accepted as a *bad* idea. You will become dependent upon this behavior of "rm", and you will find yourself someday on a normal system where "rm" is really "rm", and you will get yourself in a ton of troubles.

Second, you will eventually find that the hassle of dealing with the disk space and time involved in maintaining the trash bin, it might be easier just to be a bit more careful with "rm". For starters, you should look up the "-i" option to "rm" in the man page.

If you are still undaunted, then here is a possible simple answer. You can create yourself a "can" command which moves files into a trashcan directory.

In tcsh or csh shell, you can place the following commands in the ".login" file in your home directory:

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)

You might also want to put

rm -f ~/.trashcan/*

in the ".logout" file in your home directory to automatically empty the trash when you log out.

Same manner, in bash or sh or ksh shell, you can place the following commands in the ".bash_profile" or ".profile" file in your home directory:

alias can='mv \!* ~/.trashcan'        (junk file(s) to trashcan)
alias mtcan='rm -f ~/.trashcan/*'        (irretrievably empty trash)
if [ ! -d ~/.trashcan ]; then mkdir ~/.trashcan; fi        (ensure trashcan exists)

You might also want to put

rm -f ~/.trashcan/*

in the ".bash_logout" file in your home directory to automatically empty the trash when you log out.