J'ai couru rm -rf /*
accidentellement, mais je voulais dire rm -rf ./*
(remarquez l'étoile après la barre oblique).
alias rm='rm -i'
et --preserve-root
par défaut ne m'a pas sauvé, y a-t-il des garanties automatiques pour ceci?
Je n'étais pas root et ai immédiatement annulé la commande, mais il y avait des autorisations assouplies quelque part ou quelque chose parce que j'ai remarqué que mon invite Bash était déjà dépassée. Je ne veux pas dépendre d'autorisations et ne pas être root (je pourrais faire la même erreur sudo
), et je ne veux pas chasser de mystérieux bugs à cause d'un fichier manquant quelque part dans le système, donc, les sauvegardes et sudo
sont bonnes , mais je voudrais quelque chose de mieux pour ce cas particulier.
Penser à deux fois et utiliser le cerveau. Je l'utilise réellement! Mais je l’utilise pour résoudre une tâche de programmation complexe impliquant 10 choses différentes. Je suis immergé dans cette tâche assez profondément, il n'y a 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 telles que 'empty current dir', une partie différente de mon cerveau les traduit en commandes et parfois des erreurs sont commises. Je veux que l'ordinateur les corrige, au moins les plus dangereux.
rm -rf . /mydir
lieu derm -rf ./mydir
et tuer tout répertoire où vous étiez. Je trouve cela arrive plus souvent.rm
n'est pas une arme à feu, c'est un programme informatique, il pourrait être assez intelligent pour déterminer que l'utilisateur va supprimer certains fichiers importants et émettre un avertissement (comme c'est le cas si vous essayez de le fairerm -rf /
sans étoile).rm
est tout à fait légitime que l'administrateur système pose la question de savoir comment améliorer les commandes.Réponses:
Une des astuces que je suis est de mettre
#
au début en utilisant larm
commande.Cela empêche l'exécution accidentelle de
rm
sur le mauvais fichier / répertoire. Une fois vérifié, supprimez#
du début. Cette astuce fonctionne car, dans Bash, un mot commençant par le#
mot est ignoré, ainsi que tous les caractères restants de cette ligne. Donc, la commande est 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? Utilisertouch -- -i
outouch ./-i
Maintenant, essayez
rm -rf *
:Ici, le
*
sera étendu-i
à la ligne de commande, votre commande deviendra finalementrm -rf -i
. Ainsi, la commande demandera avant le retrait. Vous pouvez mettre ce fichier dans votre/
,/home/
,/etc/
, etc.OU
Utiliser
--preserve-root
comme une option pourrm
. Dans lesrm
nouveauxcoreutils
packages inclus , cette option est la valeur par défaut.OU
Utilisez safe-rm
Extrait du site web:
la source
-i
fichier. Hah. Silly Bash.touch -- -rf
Ton problème:
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 feront que créer de la confusion../*
signifie la même chose que*
, alors la commande ci-dessus est mieux écrite ainsi:rm -rf *
Voici un problème connexe. Je vois souvent l'expression suivante, où quelqu'un a supposé que
FOO
c'est réglé sur quelque chose comme/home/puppies
. En fait, je l’ai vu juste aujourd’hui dans la documentation d’un grand éditeur de logiciels.rm -rf $FOO/
Mais si
FOO
n'est pas défini, cela sera évalué àrm -rf /
, ce qui tentera de supprimer tous les fichiers de votre système. Le slash final n'est pas nécessaire, donc ne l'utilisez pas en pratique.Les éléments suivants feront la même chose et risquent moins de corrompre votre système:
rm -rf $FOO
J'ai appris ces astuces à la dure. Lorsque j’avais mon premier compte superutilisateur il ya 14 ans, j’ai accidentellement couru à
rm -rf $FOO/
partir d’un script shell et détruit un système. Les 4 autres administrateurs ont examiné la situation et ont déclaré: «Ouais. Tout le monde le fait une fois. Maintenant, voici votre support d'installation (36 disquettes). Va le réparer.D'autres personnes recommandent des solutions telles que
--preserve-root
etsafe-rm
. Cependant, ces solutions ne sont pas présentes pour tous les Un-xe-varients et risquent de ne pas fonctionner sous Solaris, FreeBSD et MacOSX. De plus,safe-rm
vous devez installer des packages supplémentaires sur chaque système Linux que vous utilisez. Si vous comptez sursafe-rm
, que se passe-t-il lorsque vous commencez un nouvel emploi et que l'safe-rm
installation n'est pas installée? Ces outils sont une béquille, et il est bien préférable de s’appuyer sur les défauts connus et d’améliorer vos habitudes de travail.la source
rm -rf *
. Il change toujours le répertoire en premier et utilise une cible spécifique. La raison en est qu'il utilise beaucoup l'historique du shell et il craint qu'une telle commande dans son histoire n'apparaisse au mauvais moment.rm -rf *
également été supprimé.
et..
. J'étais root, et cela a traversé les répertoires inférieurs comme../../..
, et était assez destructif. J'essaie d'être très prudent avecrm -rf *
depuis.rm -rf $FOO
ne vous aidera pas si vous en avez besoinrm -rf $FOO/$BAR
.cd $FOO && rm -rf $BAR
aidera, même si c'est beaucoup plus long.${FOO:?}
, comme dansrm -rf ${FOO:?}/
etrm -rf ${FOO:?}/${BAR:?}
. Cela l'empêchera de se traduire jamaisrm -rf /
. J'ai plus d'informations à ce sujet dans ma réponse ici .rm -rf *
une boucle for qui, par erreur, avait été remplacée par le mauvais répertoire et a fini par supprimer autre chose. Si j'avais utilisé une cible spécifique, il aurait eu beaucoup moins de chances de supprimer la mauvaise chose.Puisqu'il s'agit de "Serverfault", j'aimerais dire ceci:
Si vous avez des dizaines de serveurs ou plus, avec une grande équipe d'administrateurs / utilisateurs, quelqu'un se connecte
rm -rf
ouchown
le mauvais répertoire.Vous devriez avoir un plan pour restaurer le service affecté avec le moins possible de MTTR.
la source
Les meilleures solutions impliquent de changer vos habitudes pour ne pas les utiliser
rm
directement.Une approche consiste à exécuter en
echo rm -rf /stuff/with/wildcards*
premier. 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 fichierecho
.Une autre approche consiste à limiter la
echo
commande aux cas dans lesquels il est évident que vous allez supprimer ce que vous allez supprimer. Plutôt que de supprimer tous les fichiers d'un répertoire, supprimez-le et créez-en un nouveau. Une bonne méthode consiste à renommer le répertoire existant enDELETE-foo
, puis à créer un nouveau répertoirefoo
avec les autorisations appropriées et enfin à le supprimerDELETE-foo
. Un avantage supplémentaire de cette méthode est que la commande qui est entrée dans votre historique estrm -rf DELETE-foo
.Si vous insistez vraiment pour supprimer un groupe de fichiers parce que vous avez besoin de conserver le répertoire (parce qu'il doit toujours exister ou parce que vous n'avez pas l'autorisation de le recréer), déplacez les fichiers dans un autre répertoire et supprimez ce répertoire. .
(Appuyez sur cette touche Alt+ ..)
Supprimer un répertoire de l'intérieur serait intéressant, car il
rm -rf .
est court et présente donc un faible risque de fautes de frappe. Les systèmes typiques ne vous permettent pas de le faire, malheureusement. Vous pouvez aurm -rf -- "$PWD"
lieu de cela, avec un risque plus élevé de fautes de frappe, mais la plupart d'entre eux conduisent à ne rien enlever. 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 ne le faites pas
rm
, vouscvs rm
ou quoi que ce soit, et c'est impossible.Zsh dispose d'options pour vous inviter avant de lancer
rm
un argument répertoriant tous les fichiers d'un répertoire:rm_star_silent
(activé par défaut) avant d'exécuterrm whatever/*
, etrm_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 souhaitez supprimer tous les fichiers de certains répertoires, car vous attendez déjà l'invite. Cela peut aider à prévenir les fautes de frappe commerm foo *
pourrm foo*
.Il y a beaucoup plus de solutions flottantes qui impliquent de changer la
rm
commande. Une des limites de cette approche est qu’un jour, vous serez sur une machine avec le réelrm
et que vous appellerez automatiquementrm
, en toute sécurité dans l’attente d’une confirmation… et que vous restaurerez ensuite les sauvegardes.la source
mv -t DELETE_ME -- *
est un peu plus infaillible.rm
directement est un bon conseil! Une alternative encore meilleure consiste à utiliser lafind
commande .find somedir -type f -delete
qui supprimera tous les fichierssomedir
mais laissera le répertoire et tous les sous-répertoires.Vous pouvez toujours faire un alias, comme vous l'avez mentionné:
Vous pouvez également l'intégrer à un client twitter en ligne de commande pour avertir vos amis de la façon dont vous vous êtes presque humilié en effaçant votre disque dur en
rm -fr /*
tant que root.la source
telnet miku.acm.uiuc.edu
?Oui: ne travaillez pas en tant que root et réfléchissez toujours à deux fois avant d'agir.
Regardez aussi quelque chose comme https://launchpad.net/safe-rm .
la source
Le moyen le plus simple d'éviter les accidents
rm -rf /*
est d'éviter toute utilisation de larm
commande! En fait, j'ai toujours été tenté de courirrm /bin/rm
pour me débarrasser complètement de la commande! Non, je ne suis pas facétieux.Utilisez plutôt l'
-delete
option de lafind
commande , mais avant de supprimer les fichiers, je vous recommande de prévisualiser les fichiers que vous souhaitez supprimer:Notez que dans les versions modernes de
find
si vous omettez le nom d'un répertoire, celui-ci utilisera implicitement le répertoire actuel, de sorte que ce qui précède est l'équivalent de:Une fois que vous êtes sûr que ce sont les fichiers que vous souhaitez supprimer, vous pouvez alors ajouter l'
-delete
option:Ainsi, non seulement l'utilisation est
find
sécurisée, mais également l'expression . Si vous souhaitez supprimer uniquement certains fichiers d'une hiérarchie de répertoires correspondant à un modèle particulier, vous pouvez utiliser une expression comme celle-ci pour afficher un aperçu, puis supprimez les fichiers:Il y a beaucoup de bonnes raisons d'apprendre et d'utiliser en
find
plus juste un moyen sûrrm
, donc vous vous remercierez plus tard si vous prenez le temps d'apprendre à utiliserfind
.la source
Il y a de très mauvais conseils dans ce fil, heureusement, la plupart ont été rejetés.
Tout d’abord, lorsque vous devez être root, devenez root - sudo et les diverses astuces de pseudonymes vous affaibliront. Et pire, ils vont vous rendre imprudent. Apprenez à bien faire les choses, arrêtez de vous fier à des alias pour vous protéger. Un jour, vous allez vous planter dans une boîte qui n’a pas vos roues d’entraînement et qui fait sauter quelque chose.
Deuxièmement, lorsque vous avez la racine, pensez à vous-même comme conduisant un bus rempli d'écoliers. Parfois, vous pouvez écouter la chanson à la radio, mais d'autres fois, vous devez regarder dans les deux sens, ralentir les choses et vérifier tous vos miroirs.
Troisièmement - vous n’avez pratiquement jamais vraiment à le faire
rm -rf
- plus probablement vous voulezmv something something.bak
oumkdir _trash && mv something _trash/
Quatrième - toujours
ls
votre wildcard avantrm
- Il n'y a rien de fou à regarder quelque chose avant de le détruire pour toujours.la source
ls
.find
commande .find . -name '*~'
exemple. Mon point est quels
listera le même glob quirm
utilisera.Ceci est standard pour les expressions rationnelles dans le contexte de rm, mais cela vous aurait sauvé dans ce cas.
Je le fais toujours en
echo foo*/[0-9]*{bar,baz}*
premier, pour voir ce que l'expression rationnelle va correspondre. Une fois que j'ai la sortie, je reviens avec l'édition en ligne de commande et passeecho
àrm -rf
. Je n'utilise jamais, jamais,rm -rf
sur une expression rationnelle non testée .la source
*
a une définition très précise appelée Kleene Star, un opérateur unaire qui correspond à zéro ou plusieurs éléments de l'ensemble auquel il s'applique (dans le cas d'expressions régulières, le caractère ou l'ensemble de caractères précédant le Kleene Star), alors que les globules*
correspondent à tout ce qui suit. Ils sont sémantiquement très différents même s’ils semblent avoir une syntaxe similaire.La solution à ce problème consiste à effectuer des sauvegardes régulières. Chaque fois que vous produisez quelque chose que vous ne voulez pas risquer de perdre, sauvegardez-le. Si vous trouvez que la sauvegarde régulière est trop pénible, simplifiez le processus pour le rendre moins douloureux.
Par exemple, si vous travaillez sur le code source, utilisez un outil
git
permettant de dupliquer le code et de conserver l'historique sur une autre machine. Si vous travaillez sur des documents, utilisez un script quirsync
les transfère sur une autre machine.la source
Il semble que le meilleur moyen de réduire ce risque est d’avoir une suppression en deux étapes comme la plupart des interfaces graphiques. Autrement dit, remplacez rm par quelque chose qui déplace les éléments dans un répertoire de la corbeille (sur le même volume). Ensuite, nettoyez cette corbeille après un délai suffisant pour constater toute erreur.
Un tel utilitaire, trash-cli, est présenté ici sous Unix StackExchange .
la source
rm
.Un facteur clé important pour éviter ce type d'erreur est de ne pas se connecter avec un compte root. Lorsque vous vous connectez à l'aide d'un utilisateur normal non privilégié, vous devez utiliser
sudo
pour chaque commande. Donc, vous devriez être plus prudent.la source
sudo
et des sauvegardes. Consultez cette page: forum.synology.com/wiki/index.php/… . Il parle de créer une corbeille. J'espère que cela t'aides!Lorsque je supprime un répertoire de manière récursive, je place le
-r
et, le-f
cas échéant, à la fin de la commande, par exemplerm /foo/bar -rf
. Ainsi, si j’appuie accidentellement trop tôt sur Entrée, sans avoir encore saisi le chemin complet, la commande n’est pas récursive, elle est donc probablement inoffensive. Si je bosse Entrée en essayant de taper la barre oblique après/foo
, j'ai écritrm /foo
plutôt querm -rf /foo
.Cela fonctionne bien sur les systèmes utilisant GNU coreutils, mais les utilitaires de certains autres Unix ne permettent pas de placer les options à la fin de cette façon. Heureusement, je n'utilise pas de tels systèmes très souvent.
la source
Cela peut être compliqué, mais vous pouvez configurer des rôles dans SELinux de sorte que même si l’utilisateur devient root via sudo su - (ou tout simplement su), la possibilité de supprimer des fichiers peut être limitée (vous devez vous connecter directement en tant que root pour supprimer des dossiers). Si vous utilisez AppArmor, vous ferez peut-être quelque chose de similaire .
Bien entendu, l’autre solution serait de vous assurer que vous avez des sauvegardes. :)
la source
Évitez d'utiliser globbing . Dans Bash, vous pouvez définir
noglob
. Mais encore une fois, lorsque vous passez à un système oùnoglob
aucun paramètre n’est défini, vous pouvez l’oublier et procéder comme si de rien n’était.Définir
noclobber
pour empêchermv
etcp
détruire les fichiers aussi.Utilisez un navigateur de fichiers pour la suppression. Certains navigateurs de fichiers proposent une corbeille (par exemple, Konqueror ).
Une autre façon d’éviter les dérapages est la suivante. En ligne de commande, je
echo filenamepattern >> xxx
. Ensuite, je modifie le fichier avec Vim ou vi pour vérifier quels fichiers doivent être supprimés (surveillez les caractères de modèle de nom de fichier dans les fichiers.), Puis je%s/^/rm -f/
transforme chaque ligne en une commande de suppression. Source xxx. De cette façon, vous voyez tous les fichiers qui vont être supprimés avant de le faire.Déplacez les fichiers dans un répertoire 'attique' ou une archive. Ou utilisez le contrôle de version (comme dit avant moi).
la source
find
commande .Le ZSH me demande (par défaut) avant d’effectuer une
rm -rf *
.la source
En dehors de
chattr
, il n'y a pas beaucoup de garanties de laisser root exécuter une telle commande. C'est pourquoi les groupes appropriés et les commandes soigneuses sont importants lors de l'exécution de privilèges.La prochaine fois; définissez les fichiers que vous souhaitez supprimer - omettez «f» dans
rm -rf
, ou utilisez-lefind
et transmettez-le àxargs rm
la source
find
, mais je recommande une méthode plus sûre pour l’utiliser dans ma réponse . Il n'y a aucun besoin d'utiliserxargs rm
puisque toutes les versions modernesfind
ont l'-delete
option . En outre, pour utiliser en toute sécurité,xargs rm
vous devez également utiliserfind -print0
etxargs -0 rm
sinon, vous aurez des problèmes lorsque vous rencontrez des problèmes tels que des noms de fichiers avec des espaces.find
est une bonne suggestion, mais les nuancesxargs
sont importantes si vous suggérez de les utiliser, sinon cela crée de la confusion et de la frustration lorsque vous rencontrez des fichiers avec des espaces (évitez-les en utilisant l'-delete
option).Certains alias de sécurité pour d'autres commandes, afin d'éviter des catastrophes similaires, se trouvent ici :
Remarquez la majuscule
-I
, elle est différente de-i
:la source
J'utilise habituellement le
-v
drapeau pour voir ce qui est supprimé et avoir une chance de le faire^C
rapidement si j'ai le moindre doute. Pas vraiment un moyen d' empêcher les mauvaisrm
« s, mais cela peut être utile de limiter les dommages en cas quelque chose se passe mal.la source
Mon processus de suppression sur les machines Unix est le suivant.
ls /path/to/intented/file_or_directory
dans la fenêtre du terminal, puis appuyez surreturn
(ouTab
, si vous le souhaitez) pour voir la liste des fichiers.Si tout va bien,
cliquez sur la
up arrow
clé à récupérer àls /path/to/intented/file_or_directory
partir de l'historique du terminal.remplacer
ls
parrm
ourm -r
ourm -rf
, selon les besoins. Personnellement, je n'aime pas utiliser le-f
drapeau.Ce processus de validation empêche également l'exécution prématurée de la
rm
commande, quelque chose qui m'est arrivé, avant que je ne commence à suivre ce processus.la source
find
telle que je l'explique dans ma réponse .Si vous n'êtes pas d'humeur à acquérir de nouvelles habitudes pour le moment, il
.bashrc/.profile
est judicieux d'ajouter des tests pour vérifier si vous êtes sur le point de faire quelque chose de stupide. Je pensais que dans une fonction Bash, je pouvais rechercher un motif susceptible de gâcher ma journée et voici ce qui suit:La bonne chose à ce sujet est que ce n'est que Bash.
Ce n'est clairement pas assez générique dans cette forme, mais je pense que cela a du potentiel, alors merci de poster quelques idées ou commentaires.
la source
find
commande . En outre, je ne comprends pas pourquoi vous dites "la bonne chose à ce sujet est qu'il ne s'agit que de Bash"? Il est recommandé d' éviter les bash-isms dans les scripts .set -f
ce qui est équivalentset -o noglob
dans Bash, mais cela n’explique toujours pas votre déclaration selon laquelle "la bonne chose à ce sujet est qu’il s’agit uniquement de Bash". Au lieu de cela, vous pouvez éliminer le problème entièrement et de manière générique pour n’importe quel shell en n’utilisant pasrm
du tout, mais en utilisantfind
plutôt la commande . Avez-vous réellement essayé cette suggestion pour voir comment elle se compare à ce que vous suggérez ici?Malheureusement, je ne peux pas laisser un commentaire ci-dessus en raison d'un karma insuffisant, mais je voulais avertir les autres que le safe-rm n'est pas une panacée pour les cauchemars effacés par suppression de masse.
Les éléments suivants ont été testés sur une machine virtuelle Linux Mint 17.1 (avertissant ceux qui ne sont pas familiers avec ces commandes: ne le faites pas! En fait, même ceux qui sont familiers avec ces commandes ne devraient / ne feraient probablement jamais cela pour éviter une perte de données catastrophique):
Version textuelle (condensée):
Version de l'image (complète):
la source
J'aime l'approche Windows de la corbeille.
Je crée habituellement un répertoire nommé "/ tmp / recyclebin" pour tout ce que je dois supprimer:
Et n'utilisez jamais rm -rf, j'utilise toujours:
Puis, plus tard, je vide la corbeille à l’aide d’un script ou manuellement.
la source
Hehe (non testé et un peu facétieusement!):
Puis:
De manière réaliste, vous devriez faire une pause mentale avant d'exécuter ce type d'opération avec un glob, que vous soyez en tant que root, avec une annonce "sudo", etc. Vous pouvez exécuter un "ls" sur le même glob, etc., mais, mentalement, vous devriez vous arrêter un instant, assurez-vous de taper ce que vous voulez, assurez-vous de ce que vous voulez réellement, etc. Je suppose que c'est quelque chose que l'on apprend principalement en détruisant quelque chose la première année Un SA, de la même manière que le brûleur brûlant est un bon enseignant en vous disant que quelque chose sur le poêle peut être chaud.
Et assurez-vous d'avoir de bonnes sauvegardes!
la source
En outre, non pas comme une sauvegarde, mais comme moyen de savoir quels fichiers ont été supprimés avant que vous n’ayez appuyé sur ^ C, vous pouvez utiliser la
locate
base de données (bien sûr, seulement si elle a été installée et a survécurm
)Je l'ai appris de ce blog
la source
Utilisez simplement ZFS pour stocker les fichiers dont vous avez besoin pour résister à une suppression accidentelle et disposez d'un démon qui:
Si des fichiers sont supprimés, écrasés, corrompus, quoi que ce soit, restaurez simplement votre système de fichiers sur un clone du dernier bon instantané et vous avez terminé.
la source
pas tellement une réponse, mais un pourboire, je ne le fais
rm (dir) -rf
pas toujours,rm -rf (dir)
c.-à-d. ne faites pas le nucléaire jusqu'au dernier moment possible.Cela permet d’atténuer les situations dans lesquelles vous avez inséré le nom du répertoire de telle sorte que la suppression reste valide, telle que le glissement et la frappe de la touche Entrée.
la source
rm
, où les options doivent précéder les noms de fichiers.Je pense que ceci est une astuce de prévention puissante, avec * un raccourci d’extension dans le shell:
D'abord, tapez
rm -rf *
ourm -rf your/path/*
, NE PAS taper deEnter
clé. (bien sûr, vous devriez avoir l'habitude de ne pas appuyer sur Entrée rapidement / accidentellement lorsque vous l'utilisezrm -rf
)Ensuite, appuyez sur
Alt-Shift-8
(ieAlt-Shift-*
) pour développer explicitement le caractère générique "*" dans bash. Cela évite également de ressaisir une commande "rm -rf *" lors de la navigation dans l'historique.Enfin, après avoir vérifié que l’extension contient les bons fichiers / répertoires, appuyez sur Entrée.
Terminé.
la source
Si cela aide quelqu'un pour son propre cas:
1. Utiliser
rmsafe
:Il déplace les fichiers dans un dossier "corbeille" et vous avez toujours la possibilité de les ramener avec un simple
mv
:Source: https://github.com/pendashteh/rmsafe
2. Utiliser
safe
:Vous pouvez définir un alias pour
rm
utiliser safe:Maintenant, si vous courez,
rm /*
vous obtenez ceci en réponse:et je crois que vous ne taperez pas
y
!Source: https://github.com/pendashteh/safe
la source