187 votes

Comment puis-je éviter le rm -rf /* accidentel ?

J'ai simplement exécuté accidentellement rm -rf /*, mais je voulais dire rm -rf ./* (remarquez l'étoile après le slash).

alias rm='rm -i' et --preserve-root par défaut ne m'ont pas sauvé, alors y a-t-il des protections automatiques pour cela ?


Je n'étais pas en root et j'ai annulé la commande immédiatement, mais il y avait des permissions relax quelque part ou quelque chose parce que j'ai remarqué que mon invite de commandes Bash était déjà cassée. Je ne veux pas compter sur les permissions et ne pas être en root (je pourrais faire la même erreur avec sudo), et je ne veux pas chasser des bugs mystérieux à cause d'un fichier manquant quelque part dans le système, donc, les sauvegardes et sudo sont bien, mais je voudrais quelque chose de mieux pour ce cas spécifique.


À propos de réfléchir à deux fois et d'utiliser le cerveau. Je l'utilise en fait ! Mais je l'utilise pour résoudre une tâche de programmation complexe impliquant 10 choses différentes. Je suis tellement plongé dans cette tâche qu'il ne reste plus de puissance cérébrale pour vérifier les drapeaux et les chemins, je ne pense même pas en termes de commandes et d'arguments, je pense en termes d'actions comme 'vider le répertoire actuel', une partie de mon cerveau les traduit en commandes et parfois il fait des erreurs. Je veux que l'ordinateur les corrige, du moins les plus dangereuses.

17 votes

Pour information, vous pouvez également faire rm -rf . /mydir au lieu de rm -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 faire rm -rf / sans étoile).

20voto

aculich Points 3460

La manière la plus simple d'éviter les rm -rf /* accidentels est d'éviter tout usage de la commande rm! En fait, j'ai toujours été tenté de lancer rm /bin/rm pour me débarrasser complètement de la commande! Non, je ne plaisante pas.

Utilisez plutôt l'option -delete de la commande find, mais avant de supprimer les fichiers, je recommande de prévisualiser les fichiers que vous allez supprimer:

find | less

Remarquez que dans les versions modernes de find, si vous omettez le nom d'un répertoire, il utilisera implicitement le répertoire en cours, donc ce qui précède est équivalent à :

find . | less

Une fois que vous êtes sûr des fichiers que vous voulez supprimer, vous pouvez alors ajouter l'option -delete:

find chemin/vers/fichiers -delete

Ainsi, non seulement find est plus sûr à utiliser, il est aussi plus expressif, donc si vous voulez supprimer uniquement certains fichiers dans une hiérarchie de répertoires qui correspondent à un motif particulier, vous pourriez utiliser une expression comme ceci pour prévisualiser, puis supprimer les fichiers:

find chemin/vers/fichiers -name '*~' | less
find chemin/vers/fichiers -name '*~' -delete

Il y a de nombreuses bonnes raisons d'apprendre et d'utiliser find en plus d'un rm plus sûr, donc vous vous remercierez plus tard si vous prenez le temps d'apprendre à utiliser find.

0 votes

Discussion très intéressante. J'aime votre approche et j'ai fait un petit extrait. C'est super inefficace, car il appelle find au maximum 3 fois, mais pour moi c'est un bon début: github.com/der-Daniel/fdel

0 votes

Mon plus gros problème avec rm -rf est que vous définissez l'action avant d'entrer dans le chemin, rendant la touche de retour un bouton rouge de destruction tout en entrant des chemins absolus. C'est tout simplement la meilleure réponse à mon problème car l'opération destructive est activée à la toute fin de la commande. Je vais apprendre à utiliser la commande find pour les tâches de suppression, avant qu'il ne soit trop tard.

17voto

Jane Sales Points 10895

Il y a de très mauvais conseils dans ce fil, heureusement la plupart ont été votés négativement.

Tout d'abord, lorsque vous avez besoin d'être root, devenez root - sudo et les différents alias vous rendront faible. Et pire, ils vous rendront négligent. Apprenez à faire les choses correctement, arrêtez de dépendre des alias pour vous protéger. Un jour, vous aurez les droits root sur une boîte qui n'a pas vos stabilisateurs et vous ferez exploser quelque chose.

Deuxièmement - lorsque vous avez les droits root, considérez-vous comme au volant d'un bus plein d'enfants. Parfois, vous pouvez vous éclater sur la chanson de la radio, mais d'autres fois vous devez regarder des deux côtés, ralentir les choses et vérifier tous vos rétroviseurs.

Troisièmement - Vous avez rarement vraiment besoin de faire un rm -rf - plus probablement vous voudrez faire un mv quelquechose quelquechose.bak ou mkdir _trash && mv quelquechose _trash/

Quatrièmement - toujours utiliser ls avec votre joker avant de faire un rm - Il n'y a rien de fou à regarder quelque chose avant de le détruire pour toujours.

3 votes

+1 pour l'utilisation de ls.

0 votes

@eventi Je suis d'accord qu'il y a des conseils terribles et des hacks laids dans cette discussion. Et il est certainement une bonne idée de regarder quelque chose avant de le détruire, mais il y a une meilleure façon de le faire en utilisant la commande find.

2 votes

Je ne vois pas en quoi la commande `find` est plus simple ou plus sûre, mais j'aime ton exemple `find . -name '*~'`. Mon argument est que la commande `ls` affichera le même glob que la commande `rm` utilisera.

16voto

Sven Points 95985

Oui : ne travaillez pas en tant que root et réfléchissez toujours à deux fois avant d'agir.

Aussi, jetez un œil à quelque chose comme https://launchpad.net/safe-rm.

0 votes

Mentionné avoir travaillé en tant que racine dans l'édition

0 votes

@Valentin: o_O !!

11voto

David Schwartz Points 31009

La solution à ce problème est de sauvegarder régulièrement. Chaque fois que vous produisez quelque chose que vous ne voulez pas risquer de perdre, sauvegardez-le. Si vous trouvez que sauvegarder régulièrement est trop douloureux, simplifiez le processus pour qu'il ne soit pas douloureux.

Par exemple, si vous travaillez sur du code source, utilisez un outil comme git pour dupliquer le code et conserver l'historique sur une autre machine. Si vous travaillez sur des documents, ayez un script qui rsync vos documents vers une autre machine.

0 votes

Un système de fichiers de copie-sur-écriture tel que btrfs peut également aider. Vous pouvez facilement configurer une rotation automatisée de clichés locaux (en plus de la sauvegarde externe).

11voto

MadHatter Points 77602

C'est ma norme spécifique pour les expressions régulières dans le contexte de rm, mais elle vous aurait sauvé dans ce cas.

Je fais toujours echo foo*/[0-9]*{bar,baz}* d'abord, pour voir ce que l'expression régulière va correspondre. Une fois que j'ai la sortie, je reviens ensuite avec l'édition en ligne de commande et je change echo en rm -rf. Je n'utilise jamais, jamais rm -rf sur une expression régulière non testée.

3 votes

5 votes

D'accord, que suis-je en train de chercher? Faites-vous valoir que la syntaxe regexp pour la correspondance de fichiers est différente (et parfois appelée par un nom différent) de celle utilisée dans par exemple perl? Ou un autre point que j'ai manqué? Je m'excuse pour ma lenteur de pensée, c'est le premier jour du samedi matin ici!

11 votes

Ces choses que vous appelez "regexp" sont en fait des globales. Ce n'est pas une syntaxe regex différente, ce n'est pas une regex.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X