Forum Linux.général Comment éviter d'effacer des fichiers avec rm *

Posté par  . Licence CC By‑SA.
Étiquettes :
2
17
juin
2017

Bonsoir,

Sous bash, je viens d'effacer par erreurs des fichiers car je souhaitais écrire "rm *.jpg". Mais comme la touche 'Shift' est près de la touche 'Entrée', j'ai appuyé sur 'Entrée' par erreur et j'ai donc tapé "rm *".

Ce n'est pas la première fois que cela m'arrive et je souhaiterais un garde-fou contre cela.

Quelques remarques :
- J'ai bien noté qu'il existe safe-rm, mais il ne protège pas contre les wildcards.
- Je crois que sous zsh, il y a une protection contre cela mais je ne souhaite pas changer de shell pour l'instant.
- Idem pour le changement vers une autre disposition de clavier : je souhaite si possible rester en azerty.
- Je ne souhaite pas confirmer à chaque fois avec 'rm -i' (la plupart du temps je sais ce que je fais…)

Est-ce qu'il n'y a pas une astuce pour demander confirmation lorsque l'on tape par erreur "rm *" ?

Merci !

  • # alias rm=rm -i

    Posté par  . Évalué à 7.

    Est-ce qu'il n'y a pas une astuce pour demander confirmation lorsque l'on tape par erreur "rm *" ?

    Sous bash, la pratique habituelle (et généralement configurée par les distributions elles-mêmes) consiste à définir un alias avec alias rm=rm -i puis à utiliser « rm -f fichiers » quand on « sait ce que l'on fait ».

    Une autre astuce consiste à déclarer « rm » (ou n'importe quoi d'autre) comme une fonction sous Bash pour pouvoir contrôler son comportement plus finement en fonction des paramètres, avant de rappeler l'exécutable original.

    Il n'y a malheureusement pas d'option pour vérifier si on tape « * » en particulier car ce caractère est développé par le shell lui-même en la liste des fichiers du répertoire courant, et ce AVANT d'appeler l'exécutable ou la fonction. Ceux-ci n'ont alors aucun moyen de savoir si c'est un caractère joker qui a généré cette liste ou si l'utilisateur les a tous spécifiés expressément.

    • [^] # Re: alias rm=rm -i

      Posté par  . Évalué à 4.

      Merci pour ton avis.

      Mais est-ce qu'une astuce de ce genre là ne peut pas marcher :
      https://superuser.com/questions/864478/prevent-user-typing-accidental-space-between-rm-and-wildcard/864704#864704

      • [^] # Re: alias rm=rm -i

        Posté par  . Évalué à 4.

        Si, effectivement. Je ne connaissais pas la variable $BASH_COMMAND.

        Tu peux décomposer le contenu de cette variable en un tableau et vérifier si l'un des éléments est une étoile seule (ou à la limite une suite d'étoiles, exclusivement).

        • [^] # Re: alias rm=rm -i

          Posté par  . Évalué à 1.

          J'avais un peu peur des effets de bord, mais je vais voir si je peux adapter le script pour avoir une confirmation (au lieu de simplement refuser la commande).

          Merci

    • [^] # Re: alias rm=rm -i

      Posté par  (site web personnel) . Évalué à 2.

      Il reste pas normal en 2017 que Bash (ou rm) mette le dossier .. dans la paquet .* !

      Le joker * prends tous les fichiers (et dossiers) sauf ceux commençant par . en premier caractère. Il serait normal que dans .* l'étoile prennent tout sauf . SI le premier caractère est . !

      Là, c'est dangereux puissance 10 et en plus, je pense qu'on ne casse la compatibilité d'aucun programme car à ma connaissance, aucun programme ne fait des :

      rm -rf .*
      ou des ls -lR .* ou équivalent (a noter d'ailleurs que dans ce cas, ls ne remonte pas l'arborescence au test que je viens de faire ce qui est étonnant).

      PS : SURTOUT NE TAPEZ PAS LA COMMANDE CI-DESSUS !

      • [^] # Re: alias rm=rm -i

        Posté par  . Évalué à 2.

        zsh est plus intelligent : .* n'est pas développé en . ni ...

        • [^] # Re: alias rm=rm -i

          Posté par  . Évalué à 5.

          Pareil avec bash si la variable GLOBIGNORE est settée.

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

  • # Moins geek...

    Posté par  . Évalué à 4.

    Tu te crées un dossier "Corbeille" et un alias qui déplace tes fichiers supprimés dans ce dossier ?
    En fait, ça ne te protège pas, mais ça limite les dégâts.

    Perso, j'utilise rm -f quand je suis sûr de vouloir supprimer.

    • [^] # Re: Moins geek...

      Posté par  (site web personnel) . Évalué à 3.

      Il faudrait aussi un poubelle qui vide tous les fichiers de plus de 30j (paramètre à régler) de manière automatique. Le nombre de poubelle archi pleine est une aberration et la notion de vider sa poubelle est dans la grande majorité des cas débile. La plupart du temps, on veut pouvoir aller y chercher un truc qu'on a jeter mais seulement dans les derniers jours, jamais 6 mois avant…

    • [^] # Re: Moins geek...

      Posté par  . Évalué à 4.

      C'est la solution que je préfère. Sur stackoverflow, un posteur de cette astuce:
      * création d'un alias rmTrashcan, qui vide le dossier trashcan
      * travail uniquement avec des mv vers le dossier trashcan
      En cas d'erreur c'est plus facile à récupérer

    • [^] # Re: Moins geek...

      Posté par  . Évalué à 3.

      Et pour avoir une corbeille en ligne de commande, on peut utiliser trash-cli, disponible sur Debian et surement ailleurs aussi.
      https://github.com/andreafrancia/trash-cli

    • [^] # Re: Moins geek...

      Posté par  . Évalué à 1.

      Oui j'avais utilisé ce genre de commande auparavant mais je trouve qu'il y a plus d'inconvénients que d'avantages.
      Je préfère ne pas avoir de corbeille et récupérer les fichiers manuellement au cas où (backup, git, photorec ou autre).
      Jusqu'ici cela a été assez rare et j'ai toujours réussi à retrouver les fichiers.

  • # la plupart du temps je sais ce que je fais…

    Posté par  (site web personnel) . Évalué à 2.

    Ne pas confondre "la plus part du temps" avec "tout le temps". Tu l'as certainement compris puisque que ce n'est pas la première fois que ça t'arrive. Nous avons tous, jetez moi vos cailloux, effacé des fichiers par erreur. Ou lancer une commande par erreur : il n'est pas rare de voir un article qui parle d'un sys-admin aguerri qui fout ses serveurs en vrac avec une erreur de débutant. Mais on s'est tellement mordu les doigts qu'ensuite on vérifie ce que l'on tape à trois fois.

    Tu as identifié toi-même le problème : tu appuies sur Entrée en lieu de Shift. Tu dois donc avoir ce souci très souvent : passage à la ligne plutôt qu'obtenir une majuscule en début de phrase. Colle une punaise bien pointue sur la touche Entrée, tu apprendra vite à vérifier avant de placer ton doigt ;)

    « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

    • [^] # Re: la plupart du temps je sais ce que je fais…

      Posté par  . Évalué à 1.

      Il n'y a pas de réponse binaire à cette problématique. Cela dépend de chacun et de son évaluation des risques.
      Pour moi cela m'arrive très rarement de faire une erreur et j'ai assez de moyens de récupérer ce que j'ai perdu (gestion de version, backup, photorec, etc.).
      J'ai juste besoin de protéger "rm *" car c'est ce qui m'arrive le plus souvent car j'ai de gros doigts… ;-)

      • [^] # Re: la plupart du temps je sais ce que je fais…

        Posté par  (site web personnel) . Évalué à 3.

        Clairement la meilleure solution.

        J'ai flingué mes données de milles et une manières différentes. Que ça soit à coup de dd, de rm, de mv…
        La plupart du temps d'ailleurs sur le coup, la manip' est volontaire, juste l'impact qu'est pendant une seconde pas du tout mesuré. D'ailleurs c'est pour ça que rm -i/I me sert pas à grand chose, sur le coup je veux vraiment faire l'action qui va flinguer mes données par erreur du jugement.

        La seule solution à ça, c'est des backups qui sont à l'abri d'une erreur humaine. En gros éviter de manipuler le dossier de données et le seul backup du dossier de données en même temps.

      • [^] # Re: la plupart du temps je sais ce que je fais…

        Posté par  (site web personnel) . Évalué à 1.

        Pour moi cela m'arrive très rarement de faire une erreur et j'ai assez de moyens de récupérer ce que j'ai perdu (gestion de version, backup, photorec, etc.).
        J'ai juste besoin de protéger "rm *" car c'est ce qui m'arrive le plus souvent car j'ai de gros doigts… ;-)

        Où est le problème puisque tu dis avoir de quoi récupérer cette erreur (rm *) : gestion de version, backup, photorec, etc.

        Et prends moi pour un lapin de trois mois, il n'y a pas qu'avec la commande rm que tu dois certainement utiliser star. Perso je l'utilise à tout bout de champs. Et si j'appuyais sur Entrée souvent en lieu de star, je me poserais de sacrées questions. Après la taille des doigts toussa, on y peut rien, je te l'accorde.

        Ceci-dit la question n'est pas idiote, et trouver un moyen d'éviter de tout supprimer est ma foi une bonne chose. Du coup merci j'ai creusé. Le truc de prendre l'habitude de commencer par taper ls au lieu de rm (vu sur SO) est une très bonne idée. Un Oops ! vaut mieux qu'un Merde !.

        « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

        • [^] # Re: la plupart du temps je sais ce que je fais…

          Posté par  . Évalué à 2.

          Où est le problème puisque tu dis avoir de quoi récupérer cette erreur (rm *) : gestion de version, backup, photorec, etc.

          Parce que hier soir c'est arrivé peu de temps après ma dernière sauvegarde et que c'était des photos (donc pas de gestion de versions comme quand je tape du code).
          Photorec marche bien mais renomme tous les fichiers et balance tout dans le désordre (adieu les répertoires).
          Undelete a bien fonctionné et j'ai retrouvé mes fichiers, mais cela me donne des sueurs froides.

          Donc une protection sur "rm *", ce serait un confort supplémentaire tout simplement.

          Et prends moi pour un lapin de trois mois, il n'y a pas qu'avec la commande rm que tu dois certainement utiliser star. Perso je l'utilise à tout bout de champs. Et si j'appuyais sur Entrée souvent en lieu de star, je me poserais de sacrées questions. Après la taille des doigts toussa, on y peut rien, je te l'accorde.

          Cela arrive rarement, mais pour les autres commandes que "rm", l'action est souvent réversible, donc ce n'est pas grave.
          Ensuite je dois jongler avec pleins de layout différents, donc ce n'est pas facile de ne jamais faire d'erreur.

          Ceci-dit la question n'est pas idiote, et trouver un moyen d'éviter de tout supprimer est ma foi une bonne chose. Du coup merci j'ai creusé. Le truc de prendre l'habitude de commencer par taper ls au lieu de rm (vu sur SO) est une très bonne idée. Un Oops ! vaut mieux qu'un Merde !.

          Si je fais cela à chaque fois je vais devenir fou ! Pour moi, il faut juste que je peaufine le script bash plus haut et je serai satisfait !

          • [^] # Re: la plupart du temps je sais ce que je fais…

            Posté par  . Évalué à 4.

            Une solution qui n'est pas universelle, mais qui s'applique bien par exemple sur des photo qui ne sont pas censées être modifiées ou effacées, c'est de protéger les fichiers contre l'effacement avec chattr +i fichier.

      • [^] # Re: la plupart du temps je sais ce que je fais…

        Posté par  . Évalué à 3.

        Un peu rien à voir mais bon, pour l'anecdote.

        J'utilise git pour mon code, donc j'ai peur de rien.

        L'autre jour, j'ai raté un

        find . [...] -delete
        je sais plus exactement comment. Au final, j'ai effacé tout le répertoire.

        Y compris le répertoire .git…

  • # Protection

    Posté par  (site web personnel) . Évalué à 3.

    Quand on fait rm *, bash va donner la liste des fichiers en argument à rm.

    Il suffit d'avoir un fichier qui ressemble à un argument invalide pour empêcher les mauvaises manipulations :

    $ touch -- "-t"
    $ rm *
    rm : option invalide -- 't'
    • [^] # Re: Protection

      Posté par  . Évalué à 3.

      Et ton fichier il faut le mettre dans chaque répertoire je suppose…Mmmmm

      • [^] # Re: Protection

        Posté par  . Évalué à 3.

        Non, seulement les répertoires où tu ne veux pas effacer tous les fichiers ☺

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

    • [^] # Re: Protection

      Posté par  . Évalué à 1.

      Je trouve cette solution pas bête du tout… Avec l'alias qui va bien sur mkdir, roulez jeunesse :)

  • # ls et/ou #, et les yeux

    Posté par  . Évalué à 3.

    Quand je fais des rm un peu longs avec plusieurs cibles, j'ai tendance à commencer par faire un ls, et rappeler la ligne et l'éditer pour remplacer ls par rm quand je suis sûr que c'est bon. Quand j'ai moins de cibles ou que c'est moins risqué, ça m'arrive aussi de taper #rm …, ça permet de se protéger contre les appuis intempestifs sur la touche Entrée en cours d'écriture de la ligne.
    Dans tous les cas, une fois que j'ai tapé ma ligne, je relis systématiquement une commande rm avant de la valider.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.