Solution 1 :
Une des astuces que je suis est de mettre #
au début en utilisant le rm
commande.
[email protected]:~# #rm -rf /
Cela empêche l'exécution accidentelle de rm
sur le mauvais fichier/répertoire. Une fois vérifié, supprimez #
Depuis le début. Cette astuce fonctionne, car dans Bash un mot commençant par #
fait en sorte que ce mot et tous les caractères restants sur cette ligne soient ignorés. La commande est donc simplement ignorée.
OU
Si vous voulez empêcher tout répertoire important, il y a encore une astuce.
Créez un fichier nommé -i
dans ce répertoire. Comment créer un fichier aussi étrange ? Utilisation de touch -- -i
ou touch ./-i
Essayez maintenant rm -rf *
:
[email protected]:~$ touch {1..4}
[email protected]:~$ touch -- -i
[email protected]:~$ ls
1 2 3 4 -i
[email protected]:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
Ici le *
développera -i
à la ligne de commande, donc votre commande devient finalement rm -rf -i
. Ainsi, la commande vous demandera avant le retrait. Vous pouvez mettre ce fichier dans votre /
, /home/
, /etc/
, etc.
OU
Utilisez --preserve-root
en option sur rm
. Dans le rm
inclus dans le nouveau coreutils
packages, cette option est la valeur par défaut.
--preserve-root
do not remove `/' (default)
OU
Utiliser safe-rm
Extrait du site Web :
Safe-rm est un outil de sécurité destiné à empêcher la suppression accidentelle de fichiers importants en remplaçant /bin/rm par un wrapper, qui vérifie les arguments donnés par rapport à une liste noire configurable de fichiers et de répertoires qui ne doivent jamais être supprimés.
Les utilisateurs qui tentent de supprimer l'un de ces fichiers ou répertoires protégés ne pourront pas le faire et recevront un message d'avertissement à la place :
$ rm -rf /usr Skipping /usr
Solution 2 :
Votre problème :
Je viens de lancer rm -rf /* accidentellement, mais je voulais dire rm -rf ./* (remarquez l'étoile après la barre oblique).
La solution :Ne faites pas ça ! En pratique, n'utilisez pas ./
au début d'un chemin. Les barres obliques n'ajoutent aucune valeur à la commande et ne causeront que de la confusion.
./*
signifie la même chose que *
, donc la commande ci-dessus est mieux écrite comme :
rm -rf *
Voici un problème connexe. Je vois souvent l'expression suivante, où quelqu'un a supposé que FOO
est défini sur quelque chose comme /home/puppies
. Je l'ai vu juste aujourd'hui en fait, dans la documentation d'un grand fournisseur de logiciels.
rm -rf $FOO/
Mais si FOO
n'est pas défini, cela sera évalué à rm -rf /
, qui tentera de supprimer tous les fichiers de votre système. La barre oblique finale n'est pas nécessaire, donc, en pratique, ne l'utilisez pas.
Ce qui suit fera la même chose et est moins susceptible de corrompre votre système :
rm -rf $FOO
J'ai appris ces conseils à la dure. Lorsque j'ai eu mon premier compte superutilisateur il y a 14 ans, j'ai accidentellement lancé rm -rf $FOO/
à partir d'un script shell et détruit un système. Les 4 autres administrateurs système ont regardé cela et ont dit:"Ouais. Tout le monde fait ça une fois. Voici maintenant votre support d'installation (36 disquettes). Allez le réparer.'
D'autres personnes ici recommandent des solutions comme --preserve-root
et safe-rm
. Cependant, ces solutions ne sont pas présentes pour toutes les variantes Un*xe et peuvent ne pas fonctionner sur Solaris, FreeBSD et MacOSX. De plus, safe-rm
nécessite que vous installiez des packages supplémentaires sur chaque système Linux que vous utilisez. Si vous comptez sur safe-rm
, que se passe-t-il lorsque vous démarrez un nouveau travail et qu'ils n'ont pas safe-rm
installée? Ces outils sont une béquille, et il vaut bien mieux s'appuyer sur des défauts connus et améliorer ses habitudes de travail.
Solution 3 :
Puisque c'est sur "Serverfault", j'aimerais dire ceci :
Si vous avez des dizaines de serveurs ou plus, avec une grande équipe d'administrateurs/utilisateurs, quelqu'un va rm -rf
ou chown
le mauvais répertoire.
Vous devez avoir un plan pour rétablir le service concerné avec le moins de MTTR possible.
Solution 4 :
Les meilleures solutions consistent à changer vos habitudes pour ne pas utiliser rm
directement.
Une approche consiste à exécuter echo rm -rf /stuff/with/wildcards*
première. Vérifiez que la sortie des caractères génériques semble raisonnable, puis utilisez l'historique du shell pour exécuter la commande précédente sans le echo
.
Une autre approche consiste à limiter le echo
commande aux cas où il est aveuglément évident ce que vous allez supprimer. Plutôt que de supprimer tous les fichiers d'un répertoire, supprimez le répertoire et créez-en un nouveau. Une bonne méthode consiste à renommer le répertoire existant en DELETE-foo
, puis créez un nouveau répertoire foo
avec les autorisations appropriées, et enfin supprimer DELETE-foo
. Un avantage secondaire de cette méthode est que la commande entrée dans votre historique est rm -rf DELETE-foo
.
cd ..
mv somedir DELETE-somedir
mkdir somedir # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir # just to make sure we're deleting the right thing
rm -rf DELETE-somedir
Si vous insistez vraiment pour supprimer un tas de fichiers parce que vous avez besoin que le répertoire reste (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 autre répertoire et supprimez ce répertoire .
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
(Appuyez sur Alt +. clé.)
Supprimer un répertoire de l'intérieur serait intéressant, car rm -rf .
est court donc a un faible risque de fautes de frappe. Les systèmes typiques ne vous permettent pas de faire cela, malheureusement. Vous pouvez rm -rf -- "$PWD"
au lieu de cela, avec un risque plus élevé de fautes de frappe, mais la plupart d'entre elles conduisent à ne rien supprimer. Attention, cela laisse une commande dangereuse dans l'historique de votre shell.
Chaque fois que vous le pouvez, utilisez le contrôle de version. Vous n'avez pas rm
, vous cvs rm
ou quoi que ce soit, et c'est irréversible.
Zsh a des options pour vous inviter avant d'exécuter rm
avec un argument qui liste tous les fichiers d'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. Ceci est d'une utilité limitée si vous avez l'intention de supprimer tous les fichiers d'un répertoire, car vous attendez déjà l'invite. Cela peut aider à éviter les fautes de frappe comme rm foo *
pour rm foo*
.
Il existe de nombreuses autres solutions qui impliquent de changer le rm
commande. Une limitation de cette approche est qu'un jour vous serez sur une machine avec le vrai rm
et vous appellerez automatiquement le rm
, en sécurité dans votre attente d'une confirmation… et la prochaine chose que vous restaurerez des sauvegardes.
Solution 5 :
Vous pouvez toujours créer un alias, comme vous l'avez mentionné :
what_the_hell_am_i_thinking() {
echo "Stop." >&2
echo "Seriously." >&2
echo "You almost blew up your computer." >&2
echo 'WHAT WERE YOU THINKING!?!?!' >&2
echo "Please provide an excuse for yourself below: "
read
echo "I'm sorry, that's a pathetic excuse. You're fired."
sleep 2
telnet nyancat.dakko.us
}
alias rm -fr /*="what_the_hell_am_i_thinking"
Vous pouvez également l'intégrer à un client Twitter en ligne de commande pour alerter vos amis sur la façon dont vous vous êtes presque humilié en essuyant votre disque dur avec rm -fr /*
en tant que racine.