La corbeille sous le shell

vendredi 17 décembre 2010
par  Olivier Duquesne (DaffyDuke)
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=<span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+cmVhZGxpbmsgLWYgJnF1b3Q7JDEmcXVvdDs8L2NvZGU+"></span>
		name=<span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+YmFzZW5hbWUgJnF1b3Q7JHtmdWxsTmFtZX0mcXVvdDs8L2NvZGU+"></span>
		dirname=<span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+ZGlybmFtZSAmcXVvdDske2Z1bGxOYW1lfSZxdW90OzwvY29kZT4="></span>

		# Fichier ou répertoire déjà existant dans la corbeille
		if [ -e "${directory}/${name}" ]
		then
			name=${name}.<span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+ZGF0ZSArJXM8L2NvZGU+"></span>
			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=<span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+ZGF0ZSArJUZUJVQ8L2NvZGU+"></span>" >> "$trashinfo"
		fi
	fi
	shift
done

exit 0

Documents joints

PDF - 63.3 kio

Commentaires

Annonces

Annuaire LibreNord

Retrouvez l’annuaire de logiciels libres créé par l’association Club Linux Nord-Pas de Calais sur le site suivant http://www.librenord.org