Intercepter les appels vers rm et diriger les fichiers supprimés vers la corbeille à la place
10
Existe-t-il un moyen d'intercepter les appels vers rm et, au lieu de supprimer définitivement les fichiers, de les déplacer vers la corbeille à la place?
Dans quelle mesure demandez-vous? Voulez-vous dire pour chaque appel rm par chaque utilisateur ou processus? Ou juste pour vous pendant que vous utilisez bash? Ou ..
djeikyb
Réponses:
13
Il y a une recette sur webupd8.org pour cela. Pour éviter la pourriture des liens, voici les informations importantes (avec quelques ajouts).
sudo apt-get install trash-cli
Cela installera trash, empty-trash, list-trashet les restore-trashcommandes, que vous pouvez utiliser en l' état ou font rmun alias de trash(voir ci - dessous).
La sémantique de la trashcommande est un peu différente de la norme rm- elle n'a pas besoin d' -rindicateur pour pouvoir supprimer des répertoires. Si cela vous dérange, webupd8.org propose le script suivant, que vous pouvez mettre dans votre PATH et l'appeler trash-rm:
#!/bin/bash
# command name: trash-rm
shopt -s extglob
recursive=1
declare -a cmd
((i = 0))
for f in "$@"; do
case "$f" in
(-*([fiIv])r*([fiIv])|-*([fiIv])R*([fiIv]))
tmp="${f//[rR]/}"
if [ -n "$tmp" ]; then
#echo "\$tmp == $tmp"
cmd[$i]="$tmp"
((i++))
fi
recursive=0
;;
(--recursive) recursive=0
;;
(*)
if [ $recursive != 0 -a -d "$f" ]; then
echo "skipping directory: $f"
continue
else
cmd[$i]="$f"
((i++))
fi
;;
esac
done
trash "${cmd[@]}"
Dans Ubuntu 12.04 et versions ultérieures, la dernière commande du script devrait être à la trash-put "${cmd[@]}"place de trash "${cmd[@]}"(car la commande est passée de trashà trash-put).
Rendez ensuite le script exécutable:
chmod +x trash-rm
Une fois que vous l'avez dans un répertoire de votre PATH, ajoutez un alias à votre ~ / .bashrc, qui fera bash pour appeler votre script au lieu de la rmcommande réelle :
alias rm="trash-rm"
Comme le souligne djeikyb, l'astuce d'alias .bashrc ne fonctionnerait que pour l'utilisateur dont le .bashrc est modifié, et uniquement dans la session de terminal bash.
C'est une bonne réponse, mais ce serait encore mieux si vous la réorganisiez pour souligner le concept principal de l'utilisation d'un alias. Je pense qu'il est très important de comprendre comment "intercepter" rm. Ce qui se passe à sa place peut être personnalisé de différentes manières.
djeikyb
En outre, il serait bon de mentionner que cela n'affecte que la commande rm pour la session bash de l'utilisateur.
djeikyb
@djeikyb: merci pour les suggestions, j'ai mis à jour la réponse
Sergey
Cela fonctionne très bien pour moi sans le script (juste installé et ajouté alias="trash"). Savez-vous quel est l'avantage d'avoir le script?
desgua
@desgua: le but du script est de faire trashen sorte de se comporter davantage rmen ce qui concerne la suppression de répertoires. Cela peut être important pour certains scripts qui s'attendent rmà fonctionner comme cela, par exemple. J'ai mis à jour la réponse.
Sergey
0
libtrash (package libtrash dans Ubuntu) semble le faire, mais je ne l'ai jamais utilisé.
Réponses:
Il y a une recette sur webupd8.org pour cela. Pour éviter la pourriture des liens, voici les informations importantes (avec quelques ajouts).
Cela installera
trash
,empty-trash
,list-trash
et lesrestore-trash
commandes, que vous pouvez utiliser en l' état ou fontrm
un alias detrash
(voir ci - dessous).La sémantique de la
trash
commande est un peu différente de la normerm
- elle n'a pas besoin d'-r
indicateur pour pouvoir supprimer des répertoires. Si cela vous dérange, webupd8.org propose le script suivant, que vous pouvez mettre dans votre PATH et l'appelertrash-rm
:Dans Ubuntu 12.04 et versions ultérieures, la dernière commande du script devrait être à la
trash-put "${cmd[@]}"
place detrash "${cmd[@]}"
(car la commande est passée detrash
àtrash-put
).Rendez ensuite le script exécutable:
Une fois que vous l'avez dans un répertoire de votre
PATH
, ajoutez un alias à votre ~ / .bashrc, qui fera bash pour appeler votre script au lieu de larm
commande réelle :Comme le souligne djeikyb, l'astuce d'alias .bashrc ne fonctionnerait que pour l'utilisateur dont le .bashrc est modifié, et uniquement dans la session de terminal bash.
Et ça devrait être ça.
la source
alias="trash"
). Savez-vous quel est l'avantage d'avoir le script?trash
en sorte de se comporter davantagerm
en ce qui concerne la suppression de répertoires. Cela peut être important pour certains scripts qui s'attendentrm
à fonctionner comme cela, par exemple. J'ai mis à jour la réponse.libtrash (package libtrash dans Ubuntu) semble le faire, mais je ne l'ai jamais utilisé.
la source