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