Scripts to recover "trashed" files.

David F. Skoll dfs at doe.carleton.ca
Thu Feb 28 09:21:55 AEST 1991


In <1991Feb27.211748.13575 at wciu.EDU> art at wciu.EDU (Art Nicolaysen) writes:

>This is not a totally robust method, however; does anybody want to post 
>or email me their shell script?

I use these shell scripts from the "SunExpert" magazine, not sure of
the issue.  I wrote the "undel" script and modified the other two.
Rather than forcing the user to remove the trashed files, we have a
cron job which goes through the directory structure deleting all files
beginning with ".#" that are more than a day old.  I particularly like these
scripts because they leave deleted files in their original directory.  However,
if you use some 'rm' options like -R, -f, etc., then it just does a regular
rm.  You can change that if you want.  I also alias 'rm' to 'delete' to be
on the safe side.

#!/bin/sh
# This is a shell archive (shar 3.32)
# made 02/27/1991 22:23 UTC by dfs at data
# Source directory /usr/local/bin
#
# existing files will NOT be overwritten
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#   1316 -rwxr-xr-x delete
#    638 -rwxr-xr-x undel
#    172 -rwxr-xr-x lsdel
#
if touch 2>&1 | fgrep 'amc' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= delete ==============
if test X"$1" != X"-c" -a -f 'delete'; then
	echo "File already exists: skipping 'delete'"
else
echo "x - extracting delete (Text)"
sed 's/^X//' << 'SHAR_EOF' > delete &&
X#!/bin/sh
X# rm temporary
X# script to do a mv to a .# file rather than doing an actual rm
X# By Mathieu Federspeil, 1987
X#
X# Recognizes the -i option
X
Xcase "$1" in
X-i) shift
X    for arg in $*
X    do
X       if [ -f $arg -a -w $arg ]
X       then
X	  if echo $arg | grep "^\.#" > /dev/null
X          then
X	     echo "$arg is already deleted!"
X	  else
X             echo -n "$arg [yn] (n) ? "
X	     read yesno
X             case "$yesno" in
X	     y*|Y*)
X	       base=`basename $arg`
X	       dir=`dirname $arg`
X	       dst=${dir}/.#$base
X	       mv $arg $dst && touch $dst
X	       echo "$arg removed."
X               ;;
X	     *)
X	       echo "$arg not removed."
X	     esac
X          fi
X       elif [ -f $arg ]
X       then
X          echo "$arg: write permission denied"
X       else
X          echo "$arg: not found."
X       fi
X    done ;;
X
X-*) /bin/rm "$@" ;;
X
X*)  for arg in $*
X    do
X       if [ -f $arg -a -w $arg ]
X       then
X          if echo $arg | grep "^\.#" > /dev/null
X          then
X             echo "$arg is already deleted!"
X	  else
X             base=`basename $arg`
X	     dir=`dirname $arg`
X	     dst=${dir}/.#$base
X	     mv $arg $dst && touch $dst
X          fi
X       elif [ -f $arg ]
X       then
X          echo "$arg: write permission denied."
X       else
X	  echo "$arg: not found."
X       fi
X    done ;;
Xesac
SHAR_EOF
$TOUCH -am 1130122190 delete &&
chmod 0755 delete ||
echo "restore of delete failed"
set `wc -c delete`;Wc_c=$1
if test "$Wc_c" != "1316"; then
	echo original size 1316, current size $Wc_c
fi
fi
# ============= undel ==============
if test X"$1" != X"-c" -a -f 'undel'; then
	echo "File already exists: skipping 'undel'"
else
echo "x - extracting undel (Text)"
sed 's/^X//' << 'SHAR_EOF' > undel &&
X#!/bin/sh
X#
X# undel - recover "deleted" files
X#
X# By David Skoll - 21 November 1990
X
Xif [ "$*" = "" ] ; then
X   echo "Usage: undel filename1 [filename2...]"
X   echo "Recovers files 'deleted' with delete.  Type either the"
X   echo "original filename, or the filename with '.#' added."
X   exit
Xfi
X
Xfor arg in $*
Xdo
X   file=`echo $arg | sed -e "s/^\.#//"`
X   if [ ! -f .#$file ]
X   then
X      echo "Deleted version of $file not found."
X   elif [ ! -f $file ]
X   then
X      mv .#$file $file
X      echo "$file recovered."
X   else
X      echo "Undeleted verion of $file exists already - retrieving as $file.X"
X      mv .#$file $file.X
X   fi
Xdone
SHAR_EOF
$TOUCH -am 1130122190 undel &&
chmod 0755 undel ||
echo "restore of undel failed"
set `wc -c undel`;Wc_c=$1
if test "$Wc_c" != "638"; then
	echo original size 638, current size $Wc_c
fi
fi
# ============= lsdel ==============
if test X"$1" != X"-c" -a -f 'lsdel'; then
	echo "File already exists: skipping 'lsdel'"
else
echo "x - extracting lsdel (Text)"
sed 's/^X//' << 'SHAR_EOF' > lsdel &&
X#!/bin/sh
X#
X# lsdel - list deleted files
X#
X# By David Skoll - 21 November 1990
X#
X
Xfiles=`echo .#*`
X
Xif [ "$files" != "" ]
Xthen
X   ls .#*
Xelse
X   echo "No deleted files."
Xfi
SHAR_EOF
$TOUCH -am 1122141790 lsdel &&
chmod 0755 lsdel ||
echo "restore of lsdel failed"
set `wc -c lsdel`;Wc_c=$1
if test "$Wc_c" != "172"; then
	echo original size 172, current size $Wc_c
fi
fi
exit 0



More information about the Comp.unix.misc mailing list