Intention:
rm -rf string*
Problème:
rm -rf string *
Le premier cas est une utilisation légitime et courante de rm, une petite faute de frappe peut causer beaucoup de problèmes dans le second cas. Existe-t-il un moyen simple de se protéger intelligemment contre un caractère générique de fuite ou de début accidentel?
zsh
oubash
) je préfère prendre l'habitude d'appuyer sur la touche de tabulation (pour déclencher l'auto-complétion) avant d'appuyer sur la touche retourtouch -- -i
créera un fichier-i
qui sera passé enrm
tant que paramètre-i
lorsque vous incluez un caractère générique dans vos arguments.rm *
. Si vous tapezrm name *
, il se développerarm name -i other names
.-i
ne sera pas traité en option car il ne se trouve pas avant les noms de fichiers.Réponses:
Un
DEBUG
piège pourrait être écrit pour annuler les commandes qui semblent suspectes. Le code suivant, ou un code similaire, peut être ajouté à votre~/.bashrc
:Ajustez la logique au goût.
(Je ne m'attends pas à ce que cette approche soit utile - trop de façons de gâcher une commande de manière destructive pour les trouver à tester une par une - mais elle fournit une réponse littérale à la question).
la source
Il n'y a aucun moyen de sécuriser totalement un système pare-balles. Et en ajoutant "Êtes-vous sûr?" invite aux choses est à la fois contre-productif et conduit à "Bien sûr, je suis sûr." réactions instinctives.
Une astuce que j'ai prise dans un livre au cours des années passées est de faire d'abord,
ls -R blah*
alorsrm -fr blah*
si et seulement si la liste qui a été trouvée correspond à ce que je voulais.Il est assez facile de faire la
ls
commande d'abord, puis de ↑supprimerls -R
et de remplacer parrm -fr
.La dernière question est: "Si les informations vous ont été précieuses, où est votre sauvegarde?"
la source
^ls -R^rm -rf^
et peut-être définir un aliasls -R
c'est ce que je fais essentiellement tout le temps, mais c'est tellement instinctif à ce stade qu'il a glissé mon esprit conscient lorsque je me suis formé par réponse. Donc +1 pour ça.cat > .log
, puis je reviens et je colle ou tire le nom du fichier avant le.log
. Donc à aucun moment je n'ai> valuablefile
sur la cmdline.rm -i
, donc je compose souvent ma commande rm puis je place un\
au début de la ligne. (\rm
évite l'alias-expansion pour rm, car une partie du mot a été citée). Si j'avais besoin d'un-r
ou-f
, ouais je commence parfois parls
au lieu derm
, ou je laisse simplement de côté la-rf
partie. (modifier, comment obtenir un formatage de code barre oblique inverse? bquote bslash bslash bquote échoue.Pouvez-vous vous entraîner à utiliser, par exemple,
rmrf
à la place derm -rf
?Si c'est le cas, cette fonction bash vous donnera une chance de voir ce qui se passerait réellement avant de confirmer la commande:
Pour rendre cette fonction permanente, ajoutez cette ligne au
~/.bashrc
fichier sur chaque ordinateur que vous utilisez.Comparaison avec l'
rm
alias communIl est courant de définir un alias:
Cela a deux limites:
Si vous en venez à dépendre de cet alias, vous serez choqué lorsque vous êtes sur une machine ou dans un environnement qui ne l'a pas. En revanche, essayer de fonctionner
rmrf
sur une machine sans cette fonction rendra inoffensifcommand not found
.Cet alias n'est d'aucune aide dans votre cas car l'
-f
option que vous fournissez sur la ligne de commande remplace l'-i
option dans l'alias.la source
rm -rf
commande, que se passe-t-il? La création de pseudo-fonctions comme celle-ci finit par compliquer une solution simple: soyez plus prudent et comprenez ce que sont les autorisations.rmrf
, au lieu de simplement créer une fonction shellrm
qui vérifie les arguments-r
ou-rf
, et adopte une logique spéciale dans ce cas, sinon appelant directementcommand rm "$@"
pour appeler la vraierm
commande?-f
si vous n'en avez pas-i
. Par exemple, le-f
fait de ne pas afficher vous avertit avant de supprimer un fichier en lecture seule.Si je suis dans une situation où la suppression des mauvais fichiers est un gros problème, l'une des choses que j'ai faites est de créer un dossier poubelle, comme
mkdir trashcan
, et j'ai un scriptrmTrashcan
qui a unrm -rf trashcan/*
ourm -rf *
ou similaire, écrit très soigneusement et vérifié plusieurs fois.De cette façon, si je fais une erreur, l'erreur est sur une
mv
commande, pas sur unerm
commande. Une fois que je fais unls
et que je suis sûr de ce que je supprime, unrmTrashcan
fait le sale boulot en toute sécurité.C'était également extrêmement pratique pour une situation où je devais supprimer des sauvegardes. J'ai pu
mv
un mois entier de sauvegardes dans la corbeille,mv
les quelques que je voulais garder (le 1er du mois, le 15 du mois) dans les sauvegardes, puisrmTranshcan
le reste. Il est difficile de faire une commande similairerm
seule, et de cette façon, laissez-moils
les sauvegardes avoir confiance en quels fichiers je laisse derrière moi (plutôt que d'énumérer simplement les fichiers que j'ai l'intention de supprimer)la source
Au lieu de se soucier de deux commandes (
ls
etrm
), je pense qu'un moyen plus simple et plus facile consiste à utiliserfind
:Si vous tapez accidentellement,
"string *"
il supprimera les fichiers nommésstring chars
etstring letters
(ce que vous souhaitiez de toute façon), mais il ne récupérera pas tous les fichiers comme*
dans un shell.En outre, vous pouvez laisser le
-delete
pour voir quels fichiers il va supprimer, puis appuyer sur la flèche vers le haut et taper-delete
plus facilement que de taper^ls -R^rm -rf
ou d'autres bêtises.la source
find
fera une recherche imbriquée pour les fichiers qui correspondent au lieu des seuls paramètres explicites déclarés sur la ligne de commande. Je pense que cela manque la cible. Je pourrais toutefois avoir tord.Pas vraiment. Il est proposé dans une autre réponse que vous pouvez créer une commande personnalisée pour ajouter une invite avant d'exécuter une tâche. Mais le problème avec cette commande personnalisée est qu'elle doit être installée consciemment sur les systèmes sur lesquels vous travaillez. Et même s'il est installé, le problème est que votre réflexe de frapper
y
pour accomplir la tâche pourrait entrer en jeu.Cela signifie que tout cela est un problème d'interface utilisateur même si c'est au niveau du texte / de la ligne de commande. Combien de filets de sécurité pensez-vous qu'il y aura pour vous protéger de faire quelque chose que vous ne devriez pas faire? C'est comme une paire de ciseaux: si vous êtes en quelque sorte négligent et glissez et coupez votre main tout en ayant l'intention de couper du tissu ou du papier, qui est en faute? Ou même des feux de circulation et des panneaux d'arrêt: rien n'empêche vraiment un conducteur d'allumer un feu ou d'ignorer les panneaux de signalisation, à part une conscience aiguë de ce qui pourrait se produire s'il adoptait un comportement aussi risqué.
Cela dit, la meilleure solution réaliste réside dans les autorisations système pour les utilisateurs et les groupes. C'est le meilleur / le seul véritable filet de sécurité pour protéger un utilisateur contre lui-même.
Si vous travaillez sur un système où vous êtes le seul à y accéder, vous pourriez être tenté de
chmod 777
tout, mais ce n'est pas ainsi qu'un système rationnel est configuré. Au lieu de cela, les autorisations devraient ressembler755
à tous les répertoires et644
à tous les fichiers non exécutables. Les fichiers exécutables doivent être755
au moins, mais peut-être même744
si vous souhaitez que les autres lisent mais n'exécutent pas les fichiers.la source
Essayez de composer votre
rm
commande initiale sans l'-f
indicateur, mais avec-i
au lieu de cela, quirm
vous demandera pour chaque fichier qu'il a l'intention de supprimer. Pour les petites suppressions récursives, vous pouvez maintenir la ytouche enfoncée, une fois que vous êtes sûr que la commande a été tapée correctement. Pour les suppressions importantes, vous pouvez abandonner l'opération et utiliser l'historique de la ligne de commande pour modifier soigneusement le-i
en a-f
.la source
y[RETURN]
chaque fichier, il n'y a rien que vous puissiez maintenir avec GNU rm. La modification de la-i
est la voie à suivre, une fois que vous avez correctement tapé la commande. Ensuite, vous obtenez une invite uniquement sur un fichier en lecture seule, et peut-être d'autres choses.rm -I
pour qu'il ne s'affiche qu'une seule fois, et uniquement pour les suppressions potentiellement dangereuses (c'est-à-dire de nombreux fichiers.)rm a
-i
et des-I
drapeaux pour confirmer avant chaque suppression. Dans le passé, certaines distributions les ont activées par défaut. C'est une terrible idée. Donnez à l'utilisateur trop de boîtes de dialogue de confirmation pour les opérations normales et il commencera à les confirmer habituellement. Cela déplace simplement l'exigence de «faire attention» (toujours un drapeau rouge) à une nouvelle boîte de dialogue plus agaçante. "Oui. Oui. Oui. Oui! OUI! Bon sang, stupide ordinateur, supprime simplement les fichiers OUI OUI OUI OUI - CRAP JE SIGNIFIE NON! NOOOOOOO!" Il s'agit du problème de dialogue "Oui, mais je voulais dire non". Cette réponse fournit une explication visuelle des raisons pour lesquelles les boîtes de dialogue de confirmation arrivent au mauvais moment.Le genre d'erreur que vous décrivez est un glissement , "la réalisation d'une action qui n'était pas ce qui était prévu". L'utilisateur reconnaît généralement immédiatement l'erreur et sait exactement comment la corriger. Malheureusement, Unix ne donne pas la possibilité à l'utilisateur, rm supprime le fichier immédiatement. Tous les autres systèmes d'exploitation résolvent ce problème en permettant aux suppressions d'être annulées, au moins pendant un petit moment, par l'utilisation de la corbeille.
Il existe différents systèmes de corbeille pour Unix, et cette réponse regorge de suggestions .
La question est d'alias rm ou non d'alias rm. Avantages de l'aliasing rm ...
Contre l'aliasing rm ...
Si vous suivez trop loin le premier argument, vous finissez par utiliser vi (pas vim, vi), csh (pas tcsh, csh) et d'autres utilitaires désuets car ils sont universellement disponibles. Pourtant, il existe un risque de sur-personnalisation de votre environnement. Je préfère emporter mes utilitaires avec moi et rendre cela aussi simple que possible. YMMV.
Deux et trois sont des problèmes techniques. Ils peuvent être résolus avec un travail de faucheuse intelligent qui vérifie la taille de la poubelle et nettoie périodiquement les choses, comme un tmpreaper . Cela peut être un travail cron, ou une version plus intelligente peut utiliser les diverses infrastructures d'événements du système de fichiers disponibles sur de nombreuses distributions Linux de bureau. Ce n'est pas simple et encore plus difficile à faire efficacement. Il vaut mieux trouver un système existant que d'essayer d'en créer un.
Le quatrième peut être traité en faisant de votre nouveau rm un alias de shell
alias rm='trash'
, alors cela n'affectera pas les programmes.Le cinquième est un problème que je laisse au lecteur de résoudre. rm n'a pas beaucoup de commutateurs.
la source
rm -i
, mais j'utilise souvent\rm
pour obtenir le comportement sans alias. Je taperm -i
chaque fois que je prévois de dire non à l'un des arguments. Je lance parfois la commande avecls
comme commande, puis je ne mets le \ rm que lorsque j'ai terminé. Il n'y a donc aucun moyen que je puisse accidentellement frapper le retour aurm -rf /
lieu de/.../file
rm -I
ourm --interactive=once
est loin, beaucoup moins ennuyeux querm -i
, et attrape toujours quelque chose de dangereux (il ne demande que lorsqu'il y a plus de 3 fichiers, ou s'il est récursif, et juste UNE FOIS au lieu de POUR CHAQUE FICHIER.)-i
pourrait donner à l'utilisateur le temps de modifier ses objectifs. Cette réponse à une question connexe explique tout.rm -i
plus de 30 secondes sans l'éteindre. Alorsrm -I
que vous invite uniquement quand il est probable que vous avez foiré; l'invite ne s'affiche que pour les suppressions importantes. Lorsque vous essayez de supprimer quelques éléments et que l'invite s'affiche, vous êtes surpris et réalisez que vous avez accidentellement tapé "foo *".-rf
je viens de découvrir) sont de mauvais proxys pour détecter un éventuel échec . Vouloir supprimer un sous-répertoire n'est pas une erreur. Le message n'aide pas car il confirme simplement ce que l'utilisateur a dit de faire sans ajouter d'informations utiles à un moment où l'utilisateur ne cherche pas à vérifier. "rm: supprimer 1 argument récursivement?" "Oui, supprimez le répertoire, je vous ai juste dit de le faire! ... attendez, quel répertoire était-ce? CRAP !!!"J'apprends à tout le monde le
!$
dernier argument de la dernière astuce de commande:Cela permet une inspection de l'expansion des caractères génériques, puis l'utilisation du même modèle de glob exact sans la possibilité d'insérer un espace avant le
*
.Je suggère également aux gens de ne jamais couper et coller un motif générique de globalisation sur une ligne de commande potentiellement destructrice. Parce que dans mes propres mains ça a été un problème :)
Un technicien de mon laboratoire vient de faire cette erreur la semaine dernière (3 mois de travail) - et oui nous avons eu une sauvegarde (1 jour de retard).
la source
Tout le monde semble dire: "Soyez plus prudent", "Ne faites pas d'invite / confirmation parce que vous vous habituerez à ne pas y prêter une attention appropriée".
Cool, et tout. Je veux dire, je ne pense pas que vous devriez faire un alias pour
rm
(nirmrf
, puisque vous pouvez facilement le bousiller et taper la vraie commande).Mais pourquoi ne pouvez-vous pas créer un alias / script et l'appeler, par exemple,
remove
et ne lui donner qu'un seul argument (par exemple $ 1)? Le caractère générique devrait être de 2 $, en raison de l'espace par inadvertance (amiright?) Et donc votre script / wrapper / alias ne sera pas alimenté le second. Oui, vous ne pouvez effectuer qu'un seul ensemble de suppressions (avec un caractère générique) à la fois, mais c'est le prix que vous paieriez.Si j'écrivais quelque chose de bien, je pourrais peut-être qu'il me dise le nombre de fichiers et de répertoires qu'il envisage de supprimer, et la taille totale des choses que je supprimais, puis demande une confirmation, mais cela pourrait entraver votre flux. Peut-être en faire une option de drapeau
remove
? (-je). Vous pouvez également souhaiter vérifier $ 1 pour voir s'il ne s'agit que d' un seul caractère générique et demander une confirmation, et répertorier le répertoire dans lequel vous vous trouvez réellement.Soit dit en passant, il existe un certain nombre de
rm
remplaçants. Beaucoup essaient de se conformer à la corbeille de bureau de l'interface utilisateur. Certains de ces éléments méritent d'être étudiés.la source
remove \*
? Si votre script laisse le shell élargir son entrée, je ne pense pas qu'il aide beaucoup.Une astuce très simple consiste à mettre
-rf
à la fin:rm whatever* -rf
Cela réduit considérablement le taux d'erreur, car vous tapez plus de caractères après le
*
, vous avez donc plus de temps pour voir les fautes de frappe.Cela ne résout pas tout. Juste un truc simple au quotidien.
la source