Qu'a fait «rm -r ~» dans mon répertoire personnel?


17

gedit crée des fichiers de sauvegarde cachés se terminant par '~'. Je voulais faire un nettoyage récursif de mon arborescence de répertoires.

La commande rm *~supprimera tous les fichiers locaux se terminant par «~»

Je pensais rm -r *~ .que tous les fichiers de l'arborescence seraient supprimés, mais j'ai fait une faute de frappe rm -r ~.

Il y avait un message qu'un répertoire n'a pas pu être supprimé et j'ai quitté la commande. La question est: qu'ai-je supprimé?

J'ai remarqué que ma configuration Filezilla avait disparu. Cette commande supprime-t-elle tous les répertoires cachés du répertoire principal?


4
Eh bien, au moins, j'ai une stratégie de sauvegarde ... Aucun mal réel fait.
GUI Junkie

2
Bon à savoir; J'ai une politique de ne jamais utiliser -rsauf si je veux me débarrasser de tout.
ish

3
En guise de note latérale, rm -r *~ .supprimerait tous les fichiers et dossiers (dans le répertoire actuel) correspondant à *~ou .. ( .serait ignoré par en rmtant qu'exception spéciale, car la plupart des gens ne veulent pas supprimer récursivement le répertoire en cours. Le *~supprime tous les fichiers et répertoires du répertoire en cours se terminant par ~, mais pas les fichiers et répertoires des sous-répertoires du répertoire en cours. ) Ce n'est donc pas ce que vous auriez voulu. Vous auriez probablement voulu utiliser findavec l' -execindicateur pour parcourir récursivement l'arborescence des répertoires et supprimer de manière non récursive chaque fichier se terminant par ~.
Eliah Kagan

@EliahKagan, je suppose que oui, mais trouver avec -exec est toujours un problème. Cependant, restaurer le répertoire d'origine est plus compliqué :-)
GUI Junkie

1
Informatif: chanter le ~caractère sans y échapper (comme ceci \~:) fera penser à Bash, ZSH, etc. (la rmcommande en gros) que vous voulez dire le répertoire personnel.
Thomas Ward

Réponses:


31

Vous avez supprimé (presque) tout votre répertoire personnel!

rm -r something supprime récursivement les fichiers et répertoires dans / sous quelque chose ; il échouera uniquement sur les éléments qu'il n'est pas autorisé à supprimer, soit parce qu'ils appartiennent à un autre utilisateur (par exemple root), soit parce qu'ils sont en cours d'utilisation (par exemple, un montage GVFS).

Si vous n'avez pas ajouté -f(comme dans, rm -rf something), vous obtiendrez quelque chose comme:

rm: remove write-protected regular file something’?
rm: descend into write-protected directory something’?

À ce stade, vous pouvez abandonner et vous vous rendez probablement compte que vous avez exécuté la mauvaise commande.

Suggestions de la communauté sur la façon d'éviter de tels accidents

Remarque: wiki communautaire, tout le monde se sent s'il vous plaît libre de contribuer.

  • Pour quelques fichiers, utilisez le -i option pour obtenir une confirmation sur la suppression de fichiers ou de répertoires:

    $ rm -ri something/
    rm: remove regular file something/file~’? y
    rm: descend into directory something’? y
    rm: remove regular file something/file’? y
    rm: remove directory something’? y
  • Si vous supprimez d'un répertoire courant, préfixez-le par un ./ pour éviter de supprimer par erreur un emplacement différent.

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’

    Ce qui précède était pour démontrer l'utilisation de ./. S'il existe un sous-répertoire, vous pouvez bien sûr également l'utiliser rm -v something/*~. Attention : ne pensez pas que cela rm ./.*supprime tous les fichiers cachés du répertoire courant. Voir cette question Serverfault pour des solutions de contournement sur la globalisation des fichiers cachés.

  • Déplacer plutôt que supprimer: Plutôt que de supprimer les fichiers récursivement en premier lieu, je me suis habitué à déplacer les fichiers dont je veux me débarrasser ailleurs avant de les supprimer finalement. Si quelque chose a mal tourné, il est facile de le restaurer.

    mv -b SOURCE DEST
  • Utilisez find(éventuellement avec grep) pour prévisualiser si vous souhaitez supprimer récursivement les fichiers sélectionnés. Vous devriez essayer d'en faire un événement rare, mais si vous devez ...

    1. findsans arguments répertorie de manière récursive tous les fichiers / répertoires sous le courant. Vous devriez essayer de chercher man findcomment le rendre sélectif (un trésor), mais si vous ne voulez pas vous embêter, vous pouvez simplement utiliser le familier greppour filtrer les fichiers que vous souhaitez supprimer.
    2. Supposons que je suis un pirate du noyau uber-l33t et que les quelques Ko de fichiers "d'exemple" de mon arbre source me dérangent; Je veux supprimer tous les fichiers contenant cela dans le nom. Je tape donc find | grep example, ce qui me donne ces 20 fichiers. Cela semble bon, donc je vais maintenant supprimer ces fichiers exacts, ainsi que la rm -vsortie détaillée précédemment mentionnée, via xargs:
      trouver | exemple grep | xargs rm -v
      ce qui me donne cette sortie. Un tel aperçu prévient les problèmes où, par exemple, vous faites une faute de frappe et tapez sampleau lieu de example.

La solution ci-dessus ne doit pas être utilisée si vous pouvez avoir des noms de fichiers contenant des espaces, des tabulations, des sauts de ligne ou des guillemets ( "ou '), car cela entraînera xargssoit un échec, soit un flux rmavec des noms de fichiers incomplets, ce qui dans le pire des cas pourrait finir par supprimer le mauvais des dossiers. Le moyen sûr de faire ce qui précède est de tout faire avec findles opérateurs et les actions de.

Ce qui suit montrera tous les fichiers qui contiennent le mot example

find . -name "*example*"  

Si cette liste correspond aux fichiers que vous souhaitez supprimer, utilisez l' -execaction pour transmettre les fichiers à rm.

find . -name "*example*" -exec rm -v {} +

Voir Utilisation de la recherche pour plus d'aide sur l'utilisation find.


1
findsortie de la tuyauterie vers grepet xargs rmest dangereuse.
geirha

2
@izx: ajouté mv(ma commande préférée);)
Takkat

1
J'ajouterais au moins un exemple d'utilisation de findla manière sûre, qui ne casse pas (et potentiellement supprime les mauvais fichiers) si les noms de fichiers contiennent de l'espace, des tabulations, des retours à la ligne "ou des 'caractères. Par exemple find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha

1
@geirha: pourquoi est-ce find -deletesi dangereux? J'aurais dit quelque chose ici mais je ne sais pas autre chose qu'il a récemment trouvé et essuyé mon /malgré un essai à sec sans option -deleten'a trouvé que quelques fichiers que je voulais supprimer. Je vois que vous recommandez à la -exec rmplace.
Takkat

3
@Takkat -deleten'est pas dangereux et vous pouvez l'utiliser en toute sécurité à la place de -exec rm {} +. Je préfère généralement utiliser des outils et des fonctionnalités standard lorsque cela est possible. -deleteest une extension GNU non standard, finddonc cela fonctionnera bien sur Ubuntu, mais peut-être pas sur d'autres systèmes.
geirha

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.