Les meilleures solutions consistent à changer vos habitudes pour ne pas utiliser directement rm
.
Une approche consiste à exécuter d'abord echo rm -rf /stuff/with/wildcards*
. Vérifiez que la sortie des wildcards semble raisonnable, puis utilisez l'historique de la ligne de commande pour exécuter la commande précédente sans le echo
.
Une autre approche est de limiter l'utilisation de la commande echo
dans les cas où il est évident ce que vous allez supprimer. Plutôt que de supprimer tous les fichiers dans un répertoire, supprimez le répertoire et créez-en un nouveau. Une bonne méthode est de renommer le répertoire existant en DELETE-foo
, puis de créer un nouveau répertoire foo
avec les permissions appropriées, et enfin de supprimer DELETE-foo
. Un avantage secondaire de cette méthode est que la commande inscrite dans votre historique est rm -rf DELETE-foo
.
cd ..
mv somedir DELETE-somedir
mkdir somedir # ou rsync -dgop DELETE-somedir somedir pour conserver les permissions
ls DELETE-somedir # juste pour s'assurer que l'on supprime le bon élément
rm -rf DELETE-somedir
Si vous insistez vraiment sur la suppression d'un groupe de fichiers car le répertoire doit rester (parce qu'il doit toujours exister, ou parce que vous n'auriez pas la permission de le recréer), déplacez les fichiers vers un répertoire différent, et supprimez ce répertoire.
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
(Appuyez sur la touche Alt+..)
Supprimer un répertoire depuis l'intérieur serait pratique, car rm -rf .
est court et donc comporte peu de risques de fautes de frappe. Malheureusement, les systèmes typiques ne vous permettent pas de le faire. Vous pouvez plutôt utiliser rm -rf -- "$PWD"
, avec un risque plus élevé de fautes de frappe mais la plupart d'entre elles ne supprimeront rien. Attention cela laisse une commande dangereuse dans votre historique de ligne de commande.
Dès que vous le pouvez, utilisez un contrôle de version. Vous ne rm
, vous cvs rm
ou autre, et c'est réversible.
Zsh propose des options pour vous demander avant d'exécuter rm
avec un argument qui liste tous les fichiers dans un répertoire : rm_star_silent
(activé par défaut) demande avant d'exécuter rm whatever/*
, et rm_star_wait
(désactivé par défaut) ajoute un délai de 10 secondes pendant lequel vous ne pouvez pas confirmer. Cela a une utilité limitée si vous aviez l'intention de supprimer tous les fichiers d'un répertoire, car vous vous attendez déjà à la demande. Cela peut aider à éviter les fautes de frappe comme rm foo *
à la place de rm foo*
.
Il existe de nombreuses autres solutions qui impliquent de modifier la commande rm
. Une limitation de cette approche est qu'un jour, vous serez sur une machine avec le vrai rm
et vous appellerez automatiquement rm
, en toute confiance dans l'attente d'une confirmation... et la prochaine chose que vous ferez sera de restaurer des sauvegardes.
17 votes
Pour information, vous pouvez également faire
rm -rf . /mydir
au lieu derm -rf ./mydir
et supprimer le répertoire dans lequel vous vous trouviez. Je trouve que cela arrive plus souvent.31 votes
Pour utiliser une analogie avec les armes à feu, cette question demande de faire en sorte que le pistolet reconnaisse que je vise mon pied et ne tire pas, mais je ne veux pas avoir la responsabilité de ne pas viser mon pied en premier lieu. Les armes à feu, tout comme les ordinateurs, sont stupides et si vous faites une chose stupide, vous obtiendrez des résultats similaires. En suivant cette analogie avec les armes à feu, rien ne vous empêchera de vous faire du mal sauf la vigilance et la pratique.
82 votes
@slillibri Sauf que
rm
n'est pas un pistolet, c'est un programme informatique, il pourrait être assez intelligent pour déterminer que l'utilisateur s'apprête à supprimer des fichiers importants et émettre un avertissement (comme il le fait réellement si vous essayez de fairerm -rf /
sans étoile).90 votes
@slillibri Les armes à feu sont équipées de sécurités. Demander comment améliorer les sécurités sur la commande
rm
est une question parfaitement légitime pour un administrateur système.5 votes
@slillibri ceci est moins similaire à demander comment ne pas me tirer dessus... et plus similaire à demander comment protéger quiconque de se faire tirer dessus. VOUS pourriez savoir comment ne pas vous tirer dans le pied... mais qu'en est-il de votre utilisateur stupide... s... collègue... s... Je veux dire... enfant de 8 ans qui imite un jeu vidéo? Si vous avez une arme à feu à la maison, il vaut mieux qu'elle ait deux serrures et une alarme pour vous alerter... Cela ne fait aucune différence. Protégez vos biens (famille et données précieuses).
2 votes
Peut-être que c'est une suggestion stupide, mais pourquoi ne pas utiliser un outil comme mc (midnight commander)? Avec mc, on vous demande toujours une confirmation lorsque vous souhaitez supprimer un répertoire.
0 votes
@Giorgio Je vais essayer d'utiliser le gestionnaire de fichiers vim plus souvent :)
26 votes
Sudo rm /bin/rm non recommandé, mais empêchera la plupart des suppressions :-)
8 votes
@Gilles avait des sécurités rm, en ajoutant -r et -f, ces sécurités ont été retirées. (-r permet à rm d'utiliser readdir/rmdir, -f permet à rm d'utiliser chmod). En utilisant l'analogie de l'arme à feu et ajoutant une touche d'hyperbole: c'est (à mon avis) comme demander comment éviter de tirer sur quelqu'un en pointant l'arme sur eux (arguments à rm), en désactivant la sécurité (-rf) et en appuyant sur la gâchette (rm).
1 votes
@ValentinNemcev Faire accidentellement
rm -rf /*
est un rite de passage Unix depuis la nuit des temps ! Maintenant, il est temps pour vous d'apprendre la commandefind
pour vous sauver de ce genre de souffrance à l'avenir. Certainement, vous devriez éviter certains des mauvais conseils que l'on trouve dans les réponses à cette question. Des suggestions telles que l'utilisation d'un fichier nommé spécialement-i
reviennent à dire à un enfant apprenant à faire du vélo de ne jamais pédaler, juste pousser sur le sol avec les pieds, oh et aussi assurez-vous de maintenir la poignée de frein en permanence. Si vous voulez rouler avec les grands, utilisezfind
.3 votes
Cette analogie
rm
etgun
est horrible.rm
est quelque chose que vous utilisez une douzaine de fois par jour - avec et sans sécurité dans votre vie de programmation régulière même si vous n'êtes pas du Texas. S'il vous plaît ne faites pas de débat sur les armes à feu ;)0 votes
@Paul mais que se passe-t-il si vous faites
/chemin/vers/rm -rf /bin/ rm
. La partie/chemin/vers
est là pour empêcher un idiot de l'exécuter et d'essayer de me dénoncer - cela s'est déjà produit!0 votes
Que voulez-vous dire par "--preserve-root par défaut ne m'a pas sauvé". Est-ce que cela devrait? Qu'est-ce qui s'est mal passé avec --preserve-root ?
1 votes
Limiter l'accès root et sudo aux personnes prudentes. Faites des sauvegardes de vos données. Utilisez toujours
set -u
dans vos scripts bash. Si vous travaillez avec des personnes qui suppriment souvent/
, alors envisagez le démarrage sans disque nfs ou le démarrage sans disque en ram initrd. Il existe d'autres façons de rendre/
en lecture seule, mais cela devient compliqué en fonction de votre configuration.1 votes
Entrez la commande sans appuyer sur Entrée, vérifiez, inspirez, vérifiez à nouveau, expirez, vérifiez une fois de plus, Appuyez sur Entrée.
1 votes
Pour ce que ça vaut, beaucoup (moi y compris) considèrent
alias rm="rm -i"
comme une pratique dangereuse plutôt que sûre. Voici pourquoi : cela amène une personne à s'attendre à ce que rm leur demande toujours d'abord s'ils veulent vraiment faire la chose. S'ils sont ensuite sur un autre système, ou connectés à un autre compte (peut-être root!), ou autre, et que l'alias n'est pas là... ils s'y attendent, ne l'obtiennent pas, et une suppression catastrophique se produit très probablement. Au lieu de cela, utilisezecho rm
ou type des commandesrm -i
. Faire de ces choses des habitudes est, à mon avis, le meilleur moyen de prévenir ce genre de choses.1 votes
@Paul rm est souvent une commande intégrée au shell, donc les effets seront étonnamment limités.
0 votes
Faites attention aux scripts avec le genre de langage
rm $MYDIRENAMEEMPTYVAR/
. entrainez vos yeux.