Sous Unix, comment supprimer tout ce qui se trouve dans le répertoire actuel et en dessous?

Réponses:

166

Pratiquez l'informatique en toute sécurité. 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 --indiquent rmque ce <dir-to-remove>n'est pas une option de ligne de commande, même si elle commence par un tiret.

Tvanfosson
la source
8
Pourquoi est-ce plus sûr?
Yen
34
Parce que vous correspondez spécifiquement à un répertoire nommé et que vous êtes donc moins susceptible de supprimer quelque chose que vous n'avez pas l'intention de supprimer.
tvanfosson
5
Vrai. Je me voyais faire ça assez facilement.
Yen
26
ne supprime-t-il pas le répertoire lui-même? Vous devez ensuite faire mkdir <dir-to-remove>. Mais alors tout lien physique faisant référence à ce répertoire sera un répertoire distinct par la suite.
Johannes Schaub - litb
5
@Yen, si vous utilisez, rm ./vous pourriez taper accidentellement rm . /ce qui pourrait être un désastre.
irfandar
44

Supprime tous les fichiers / répertoires sous celui actuel.

find -mindepth 1 -delete

Si vous voulez faire de même 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 les sous-répertoires et les fichiers de celui-ci, mais également le répertoire lui-même, omettez -mindepth 1. Faites-le sans -deletepour obtenir une liste des éléments qui seront supprimés.

Johannes Schaub - litb
la source
J'avais besoin de supprimer tous les fichiers dans les sous-répertoires, mais je ne voulais pas supprimer les sous-répertoires eux-mêmes. find <name-of-direcotry> -mindepth 2 -delete a très bien fonctionné!
Tim Dearborn
Vous en avez besoin -mindepth 1si vous spécifiez un répertoire ( find <name-of-directory> -mindepth 1 -delete). Sinon Johannes a raison, il ne supprimera pas le répertoire de travail actuel (lors de l'utilisation find -delete).
Weboide
OMI, c'est la meilleure réponse, en particulier dans les scripts.
wizonesolutions
1
J'ai essayé: find -mindepth 1 -deletemais j'ai eu illegal option -- m mais cela a très bien fonctionné lorsque j'ai supprimé l'option mindepth find . -delete
sharon
41

Ce que je fais toujours, c'est taper

rm -rf *

et puis appuyez sur * ESC- et bash étendra le * à une liste explicite des fichiers et répertoires dans le répertoire de travail courant.

Les avantages sont:

  • Je peux consulter la liste des fichiers à supprimer avant d'appuyer sur ENTRÉE.
  • L'historique des commandes ne contiendra pas "rm -rf *" avec le caractère générique intact, qui pourrait alors être accidentellement réutilisé 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 simplement supprimé?". Les noms de fichiers 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 pour TAB avec cette ligne en .bashrc:

bind TAB:insert-completions
Ville Laurikari
la source
Manquant --dans cette réponse? Cette approche est géniale dans l'ensemble, je dois dire.
Ben Voigt
la meilleure façon est d'exécuter ceci avec sudo
Abbas Torabi
22

Utilisation

rm -rf *

Mise à jour: Le .représente le répertoire courant, mais nous ne pouvons pas l'utiliser. La commande semble avoir des vérifications explicites pour .et.. . Utilisez plutôt le globbing générique. Mais cela peut être risqué.

Une version plus sûre de l'OMI consiste à utiliser:

rm -ri * 

(cela vous demande une confirmation avant de supprimer chaque fichier / répertoire.)

dirkgently
la source
13
«Peut être risqué» est merveilleusement laconique.
5
En faisant des choses comme ça, j'ai trouvé un rapide ls -r. vous permet d'abord de voir ce que vous allez supprimer. Utile pour donner une idée rapide que vous n'allez pas supprimer le disque entier ...
Rich Bradshaw
2
Pourquoi est-ce plus risqué que rm -rf <subdir-name>?
Yen
2
@Yen - parce que si vous le faites au mauvais endroit, vous pouvez obtenir des résultats désastreux. L'utilisation d'un nom spécifique au mauvais endroit ne peut aller mal que si le même sous-répertoire s'y trouve.
tvanfosson
1
Vous ne pouvez pas supprimer le parent tout en résidant dans l'enfant.
dirkgently
6

Il est correct que rm –rf .supprimera tout dans le courant directement, y compris les sous-répertoires et leur contenu. Le point unique ( .) signifie le répertoire courant. attention à ne pas le faire rm -rf ..car le double point ( ..) signifie le répertoire précédent.

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

Premièrement, si vous regardez la rmpage de manuel des commandes ( man rmsous la plupart des Unix), vous remarquez que cela –rsignifie "supprimer le contenu des répertoires de manière récursive". Donc, faire tout rm -r .seul supprimerait tout dans le répertoire courant et tout ce qui se trouve en dessous.

Dans rm –rf .l'ajout -f signifie "ignorer les fichiers inexistants, ne jamais demander". Cette commande supprime tous les fichiers et répertoires du répertoire actuel et ne vous invite jamais à confirmer que vous voulez vraiment le faire. -fest 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 avoir la possibilité de vous assurer que c'est vraiment ce que vous voulez.

En revanche, dans rm -ri .le -iqui remplace le -fmoyen "demander avant toute suppression". Cela signifie que vous aurez une chance de dire "oups! Ce n'est pas ce que je veux" avant que rm ne supprime tous vos fichiers.

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

Pierre-Luc Simard
la source
6

Que diriez-vous:

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

la source
27
jQuery est si puissant.
Pawel du
5
rm  -rf * 

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

nkassis
la source
4

assurez- vous que vous êtes dans le bon répertoire

rm -rf *
digitaljoel
la source
2
Cela ne supprime pas les fichiers ou sous-répertoires dont le nom commence par un point.
1
vrai. dans mes tests, rm -rf non plus. tvanfosson a la meilleure solution IMO avec son "cd ..; rm -rf <dir-to-remove>"
digitaljoel
2

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

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
devnev
la source
1

Je pense que cette réponse est meilleure:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Si votre répertoire de niveau supérieur est appelé images, exécutez rm -r images/*. Cela utilise l'opérateur glob du shell *pour s'exécuter rm -rsur chaque fichier ou répertoire dans les images.

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

Francisco Noriega
la source