|
Undelte für Linux geht nicht ? Geht doch ! |
|
|
Linux ist ein feines Betriebsystem. Doch die Funktion 'rm' ist sehr heftig. Das liegt daran, wie Linux mit seinem Filesystem umgeht. Eine mit 'rm' gelöschte Datei ist unwiderruflich gelöscht. Das Script, das wir Ihnen hier vorstellen, umgeht dieses Problem. Es ist sogar mit 'unrm' möglich, die Datei anschließend wieder herzustellen.
Legen Sie zwei neue Dateien mit dem Namen newrm und unrm an. Legen Sie die Dateien z.B. in den Ordner /bin
newrm #!/bin/sh
mydir="$HOME/.TRASH" realrm="/bin/rm " copy="/bin/cp -R"
if [ $# -eq 0 ] ; then exec $realrm fi
flags=""
while getopts "dfiPRrvW" opt do
case $opt in f ) exec $realrm "$@" ;; * ) flags="$flags -$opt" ;;
esac done shift $(( $OPTIND - 1 ))
if [ ! -d $mydir ] ; then if [ ! -w $HOME ] ; then echo "$0 failed: kann $mydir in $HOME nicht erstellen" >&2 exit 1 fi mkdir $mydir chmod 700 $mydir fi
for arg do newname="$mydir/$(date "+%S.%M.%H.%d.%m").$(basename "$arg")" if [ -f "$arg" ] ; then $copy "$arg" "$newname" elif [ -d "$arg" ] ; then $copy "$arg" "$newname" fi done
exec $realrm $flags "$@"
----------------------------------------------
unrm
#!/bin/sh
mydir="$HOME/.TRASH" realrm="/bin/rm" move="/bin/mv"
dest=$(pwd)
if [ ! -d $mydir ] ; then echo "$0: No deleted files directory: nothing to unrm" >&2 ; exit 1 fi
cd $mydir
if [ $# -eq 0 ] ; then # no args, just show listing echo "Contents of your deleted files archive (sorted by date):" # ls -FC | sed -e 's/[[:digit:]][[:digit:]]\.//g' -e 's/^/ /' ls -FC | sed -e 's/\([[:digit:]][[:digit:]]\.\)\{5\}//g' \ -e 's/^/ /' exit 0 fi
# Otherwise we must have a pattern to work with. Let's see if the # user-specified pattern matches more than one file or directory # in the archive.
matches="$(ls *"$1" 2> /dev/null | wc -l)"
if [ $matches -eq 0 ] ; then echo "No match for \"$1\" in the deleted file archive." >&2 exit 1 fi
if [ $matches -gt 1 ] ; then echo "More than one file or directory match in the archive:" index=1 for name in $(ls -td *"$1") do datetime="$(echo $name | cut -c1-14| \ awk -F. '{ print $5"/"$4" at "$3":"$2":"$1 }')" if [ -d $name ] ; then size="$(ls $name | wc -l | sed 's/[^0-9]//g')" echo " $index) $1 (contents = ${size} items, deleted = $datetime)" else size="$(ls -sdk1 $name | awk '{print $1}')" echo " $index) $1 (size = ${size}Kb, deleted = $datetime)" fi index=$(( $index + 1)) done
echo "" echo -n "Which version of $1 do you want to restore ('0' to quit)? [1] : " read desired
if [ ${desired:=1} -ge $index ] ; then echo "$0: Restore cancelled by user: index value too big." >&2 exit 1 fi
if [ $desired -lt 1 ] ; then echo "$0: restore cancelled by user." >&2 ; exit 1 fi
restore="$(ls -td1 *"$1" | sed -n "${desired}p")"
if [ -e "$dest/$1" ] ; then echo "\"$1\" already exists in this directory. Cannot overwrite." >&2 exit 1 fi
echo -n "Restoring file \"$1\" ..." $move "$restore" "$dest/$1" echo "done."
echo -n "Delete the additional copies of this file? [y] " read answer
if [ ${answer:=y} = "y" ] ; then $realrm -rf *"$1" echo "deleted." else echo "additional copies retained." fi else if [ -e "$dest/$1" ] ; then echo "\"$1\" already exists in this directory. Cannot overwrite." >&2 exit 1 fi
restore="$(ls -d *"$1")"
echo -n "Restoring file \"$1\" ... " $move "$restore" "$dest/$1" echo "done." fi
exit 0
-------------------------------------
Soll das ganze Script für User des Systems noch so gebaut werden, dass der User gar nichts davon mitbekommt, dass es 'newrm' benutzt, können Sie im Profil des Users einen neuen Eintrag wie folgt definieren:
alias rm=/bin/newrm
Achten Sie darauf, dass im Ordner $Home/.TRASH nun alle gelöschten Datein gespeichert werden. Sie sollten von Zeit zu Zeit checken, dass der Ordner nicht überläuft. Eventuell ist zu prüfen, ob man nicht einen CRON-JOB laufen lassen will, der den Ordern $HOME/.TRASH automatisch von seinen Inhalten cleant. |