La corbeille sous le shell
par
popularité : 1%

Et oui, qui n’a jamais rippé sur le rm et souhaité vouloir récupérer ses fichiers, les a cherché dans la corbeille GNOME, a cherché après un undelete quelconque. A on aimerait avoir l’option "undo" à rm. Mais non, que neni, ce n’est pas dans la philosophie des administrateurs systèmes....
Un ami (Christophe Van Renterghem) vient de coder une solution pour remédier à ce manque, un frontend à rm afin de sécuriser la commande, mieux que l’option -i (interactive). Cette fois, rm déplace les fichiers ou les dossiers à supprimer dans la corbeille de GNOME et ajoute un timestamp qui va bien si une version existe déjà... Le script fonctionne sous une Ubuntu Maverick. L’absence de shell en début de script est normal, il est inclus par le .barshrc. Et surtout, n’oubliez pas de positionner un alias sur la commande rm pour passer dans les fonctions ci-dessous :
Le voici ci-dessous (.rm.bash) :
# mode debug
# set -x
# Pas de paramètres, on sort
if [ $# -eq 0 ]
then
exit 1
fi
recursive=1
nobin=1
optNoBin=-
optFileOrDir=-
param=1
# Options passées (r=récursif, f=force, s=suppression définitive, i=interactif, v=verbeux)
while getopts hHrRfFsSiIvV arg
do
param=0
case $arg in
h | H) echo "usage: rm [-frsiv] file ... (f=force, r=recursive, s=suppress definitively, i=interactive, v=verbose)"
exit 0;;
r | R) recursive=0
optNoBin=${optNoBin}r;;
f | F) optNoBin=${optNoBin}f
optFileOrDir=${optFileOrDir}f;;
s | S) nobin=0;;
i | I) optNoBin=${optNoBin}i
optFileOrDir=${optFileOrDir}i;;
v | V) optNoBin=${optNoBin}v
optFileOrDir=${optFileOrDir}v;;
\?) exit 2;;
esac
done
if [ ${optNoBin} = "-" ]
then
optNoBin=
fi
if [ ${optFileOrDir} = "-" ]
then
optFileOrDir=
fi
if [ $param -eq 0 ]
then
shift
fi
# Répertoire Poubelle
directory=~/.local/share/Trash/files
while [ $# -gt 0 ]
do
# Suppression définitive
if [ $nobin -eq 0 ]
then
/bin/rm ${optNoBin} "$1"
#Poubelle
else
fullName=`readlink -f "$1"`
name=`basename "${fullName}"`
dirname=`dirname "${fullName}"`
# Fichier ou répertoire déjà existant dans la corbeille
if [ -e "${directory}/${name}" ]
then
name=${name}.`date +%s`
fullName=${dirname}/${name}
fi
newDest=${directory}/${name}
ok=0
# Fichier ou répertoire inexistant
if [ ! -e "$1" ]
then
ok=1
echo "$1: No such file or directory"
# rm (-f) fichier
elif [ -f "$1" ]
then
mv $optFileOrDir "$1" "${newDest}"
# rm -r(f) répertoire
elif [ -d "$1" -a $recursive -eq 0 ]
then
mv $optFileOrDir "$1" "${newDest}"
# rm (-f) répertoire => erreur
elif [ -d "$1" ]
then
ok=1
echo "rm: $1 is a directory"
else
ok=1
fi
# Ecriture des infos de restaure du fichier
if [ $ok -eq 0 ]
then
trashinfo=~/.local/share/Trash/info/$name.trashinfo
echo "[Trash Info]" > "$trashinfo"
echo "Path=$fullName" >> "$trashinfo"
echo "DeletionDate=`date +%FT%T`" >> "$trashinfo"
fi
fi
shift
done
exit 0
Commentaires