web-dev-qa-db-fra.com

Sous Unix, comment effacez-vous tout le répertoire actuel et son contenu inférieur?

Je sais que cela supprimera tout dans un sous-répertoire et en dessous:

rm -rf <subdir-name>

Mais comment effacez-vous tout ce qui se trouve dans le répertoire actuel, ainsi que tous les sous-répertoires situés en dessous, ainsi que le contenu de tous ces sous-répertoires?

107
Yen

Pratiquez l'informatique sécurisée. Montez simplement d'un niveau dans la hiérarchie et n'utilisez pas d'expression générique:

cd ..; rm -rf -- <dir-to-remove>

Les deux tirets -- dire rm que <dir-to-remove> n'est pas une option de ligne de commande, même si elle commence par un tiret.

165
tvanfosson

Supprime tous les fichiers/répertoires situés sous le fichier actuel.

find -mindepth 1 -delete

Si vous voulez faire la même chose avec un autre répertoire dont vous avez le nom, vous pouvez simplement le nommer.

find <name-of-directory> -mindepth 1 -delete

Si vous souhaitez supprimer non seulement ses sous-répertoires et ses fichiers, mais également son répertoire, omettez -mindepth 1. Faites-le sans le -delete pour obtenir une liste des choses à supprimer.

Ce que je fais toujours c'est taper

rm -rf *

et puis appuyez sur ESC - *, et bash étendra le * à une liste explicite de fichiers et de répertoires du répertoire de travail en cours.

Les avantages sont:

  • Je peux consulter la liste des fichiers à supprimer avant d'appuyer sur ENTREE.
  • L'historique des commandes ne contiendra pas "rm -rf *" avec le caractère générique intact, qui pourrait ensuite être réutilisé accidentellement au mauvais endroit au mauvais moment. Au lieu de cela, l'historique des commandes contiendra les noms de fichiers réels.
  • Il est également devenu pratique une ou deux fois de répondre "attendez une seconde ... quels fichiers ai-je effacé?". Les noms de fichier sont visibles dans le tampon de défilement du terminal ou dans l’historique des commandes.

En fait, j'aime tellement ça que j'en ai fait le comportement par défaut de TAB avec cette ligne dans .bashrc:

bind TAB:insert-completions
40
Ville Laurikari

Utilisation

rm -rf *

Mise à jour: le . représente le répertoire en cours, mais nous ne pouvons pas l'utiliser. La commande semble avoir des contrôles explicites pour . et ... Utilisez plutôt le caractère générique Globbing. Mais cela peut être risqué.

Une version plus sûre IMO est d'utiliser:

rm -ri * 

(Ceci vous invite à confirmer avant de supprimer chaque fichier/répertoire.)

21
dirkgently

Il est exact que rm –rf . supprime tout le contenu actuel, y compris les sous-répertoires et leur contenu. Le point unique (.) désigne le répertoire en cours. attention à ne pas faire rm -rf .. depuis le double point (..) désigne le répertoire précédent.

Ceci étant dit, si vous êtes comme moi et que plusieurs fenêtres de terminal sont ouvertes en même temps, vous feriez mieux de rester en sécurité et d'utiliser rm -ir . Regardons les arguments de la commande pour comprendre pourquoi.

Premièrement, si vous regardez la rm page de manuel de la commande (man rm sous la plupart des Unix) vous remarquez que –r signifie "supprime récursivement le contenu des répertoires". Donc, faire rm -r . seul supprime tout ce qui se trouve dans le répertoire actuel et tout ce qui le suit.

Dans rm –rf . le -f ajouté signifie "ignorer les fichiers inexistants, jamais demander". Cette commande supprime tous les fichiers et répertoires du répertoire en cours et ne vous invite jamais à confirmer que vous souhaitez réellement le faire. -f _ est particulièrement dangereux si vous exécutez la commande sous un utilisateur privilégié, car vous pouvez supprimer le contenu de n’importe quel répertoire sans pouvoir vous assurer que c’est vraiment ce que vous voulez.

D'autre part, dans rm -ri . le -i qui remplace le -f signifie "Demander avant toute suppression". Cela signifie que vous aurez la possibilité de dire "oups! Ce n'est pas ce que je veux" avant que l'entreprise ne supprime avec joie tous vos fichiers.

Dans mes premiers jours d'administrateur système, j'ai fait un rm -rf / sur un système en étant connecté avec tous les privilèges (racine). Le résultat fut deux jours passés à restaurer le système à partir de sauvegardes. C'est pourquoi j'emploie maintenant rm -ri maintenant.

6
rm  -rf * 

Ne le fais pas! C'est dangereux! ASSUREZ-VOUS QUE VOUS ÊTES DANS LE BON RÉPERTOIRE!

5
nkassis

Que diriez-vous:

rm -rf "$(pwd -P)"/* 
5
jon

make bien sûr vous vous trouvez dans le bon répertoire

 rm -rf * 
4
digitaljoel

Cette solution sûre et générale la plus simple est probablement:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
2
mark

Je crois que cette réponse est meilleure:

https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

Si votre répertoire de niveau supérieur s'appelle images, exécutez rm -r images/*. Ceci utilise l'opérateur glob de shell * courir rm -r sur chaque fichier ou répertoire dans les images.

en gros, vous montez d’un niveau, puis vous dites tout supprimer dans le répertoire X. De cette façon, vous spécifiez toujours le contenu du dossier dont le contenu doit être supprimé, ce qui est plus sûr que de simplement dire "tout supprimer ici", tout en préservant le dossier d'origine (ce que vous souhaitez parfois parce que vous n'êtes pas autorisé ou que vous ne voulez pas modifier les autorisations existantes du dossier)

1
Francisco Noriega