Comment supprimer tous les fichiers et sous-répertoires d'un répertoire SANS supprimer le répertoire dans bash?

53

Existe-t-il une commande permettant de supprimer tous les fichiers et sous-répertoires d'un répertoire SANS supprimer le répertoire?

Par exemple, si j'ai le répertoire "dontDeleteMe" avec les sous-répertoires "1", "2", "3" et que chaque sous-répertoire contient quelques images, comment puis-je supprimer les sous-répertoires "1", "2" et "3" et tous les fichiers qu'ils contiennent, sans supprimer le répertoire parent "dontDeleteMe"?

utilisateur784637
la source

Réponses:

66

Pour supprimer tout ce qui se trouve dans un répertoire sans le supprimer, tapez:

rm -rfv dontDeleteMe/*

S'il vous plaît noter que la /*partie est très importante. Si vous mettez un espace avant le *, tous vos fichiers de votre répertoire actuel seront supprimés.

Aussi, soyez très prudent en jouant avec rm, -ret *tous dans la même commande. Ils peuvent être une combinaison désastreuse.

Mise à jour: Ok, j'ai réalisé que si vous avez des fichiers cachés / point [les noms de fichiers avec des points au début, ex .hidden], cela laissera ces fichiers intacts.

Alors vraiment, la solution la plus simple à la question initiale est: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Une autre solution consisterait à utiliser findl' -execoption ou la conduite vers xargs(ci-dessous):

find dontDeleteMe/* -print0 | xargs -0 rm -rv

Mat
la source
Pouvez-vous donner un exemple d'utilisation de xargs? Qu'est-ce que xargs?
Justingrif
@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv Je pense que dans la plupart des cas, cela fonctionnera, quels que soient les espaces et autres. Mais allez dans /tmp/un répertoire de test et essayez-le. :)
Matt
Oh, et dans la page de manuel: "xargs - construit et exécute des lignes de commande à partir d’une entrée standard"
Matt
5
Recréer un répertoire ne signifie pas supprimer son contenu. par exemple umask différences d'autorisation de répertoire, les différences de propriétaire, etc ... La réponse de enzotib résoudrait les problèmes avec votre syntaxe originale
3
Ce n'est pas une bonne réponse. L'utilisation de * est dangereuse et ne fonctionnera pas sur les fichiers de points sans "dotglob" (voir ci-dessous). rm -rf dontDeleteMe && mkdir dontDeleteMene garantit pas que le répertoire est recréé avec les mêmes autorisations / propriétaires. Utilisez plutôt l'une des find dontDeleteMe/ -mindepth 1 -deletevariantes ci-dessous.
Nils Toedtmann
27

La seule raison pour laquelle rm -r ./*vous ne travaillez pas toujours, c'est parce que vous pouvez avoir des fichiers cachés et / ou des dossiers sans correspondance *.

A cette fin, bashfournissez une option pour faire *correspondre tout, même les objets cachés:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Il peut être utile de rétablir dotglobson état par défaut (non défini) si vous continuez à utiliser le shell où vous avez exécuté les commandes ci-dessus:

shopt -u dotglob 
enzotib
la source
Cela peut également ne pas fonctionner si vous avez un grand nombre de fichiers
S ..
23

Terminal ouvert ( Ctrl+ Alt+ T) et tapez ceci:

find somedir -mindepth 1 -delete

Cela correspondra à tous les fichiers et répertoires au sein de somedirses (grands) enfants, y compris les fichiers de points "cachés" mais s’excluant eux- somedirmêmes pour -mindepth 1, ensuite -delete.

Guciek
la source
Bienvenue sur AskUbuntu! Bien que votre réponse puisse potentiellement aider l’affiche originale, le manque d’informations permettant d’expliquer ce que cela ferait pour l’aider à rendre votre réponse incomplète.
Oyibo
3
Manque d'explication, mais reste la meilleure réponse. Fonctionne également sous OSX (sauf pour l’ouverture du terminal, bien sûr).
noamtm
6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Utilisez l' xdevoption pour supprimer les fichiers uniquement dans les limites du périphérique.

Sergey
la source
La recherche GNU a -delete. Cela implique -depthet est plus facile à retenir que-depth -exec rm -Rf {} \;
Nils Toedtmann
4

Pour supprimer (dans le terminal) tous les fichiers et sous-répertoires à l'exception du répertoire de base nommé "dontdelete":

rm -rf dontdelete/*
KyleN
la source
Cela ne supprime pas les fichiers cachés, donc "tous les fichiers" peut être une déclaration trop gras.
Stefan van den Akker
4

Vous pouvez utiliser findavec le -deletedrapeau:

find dontDeleteMe/* -delete

Le /*est important car il est findrecommandé de rechercher uniquement DANS le dossier appelé "dontDeleteMe".

Assurez-vous également que le -deletedrapeau est à la fin de la findcommande.

SaultDon
la source
1
Cette solution ne supprime aucun fichier caché, sauf si vous l'activez dotglob. Sinon, l’ -mindepth 1option drapeau semble être le seul moyen de le faire fonctionner.
Stefan van den Akker
3
rm -rf  directory/{.*,/*}

Ce qui dit:

Supprimer tous les fichiers en commençant par. dans "répertoire" et tous les autres fichiers aussi.

Bien que, comme l'a gentiment noté Neftas, cette solution n'est pas sans danger!

La solution plus sûre est:

 rm -rf directory/!(.|..)
Tebe
la source
Cette commande peut potentiellement être dangereuse, car vous incluez également des répertoires .et ... Cela peut être évité en passant {.*}à {.??*}, mais vous ne supprimerez pas les fichiers cachés comportant un seul caractère, tel que .a.
Stefan van den Akker
c'est quoi ça? rm -rf directory /! (. | ..)
mardi
Cela semble être une bien meilleure solution que celle que j'ai proposée. Puis-je vous suggérer de modifier votre réponse?
Stefan van den Akker
suggestion acceptée)
Tebe
1

Je ne sais pas pourquoi c'est si complexe, aidez-moi si je me trompe

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

C'est ça

utilisateur353305
la source
Cela a aussi le léger défaut d'essayer de supprimer le répertoire en cours, ce qui, bien sûr, ne fonctionne pas, car il est toujours utilisé comme répertoire de travail du shell invoquant.
David Foerster
1

Il y a une réponse encore plus simple:

  1. cd dontDeleteMe

  2. rm -rf *

Cours de base sur l’administration du système: veillez à savoir où vous en êtes lorsque vous utilisez des commandes rapides comme celle-ci.

Je ne peux pas dire ça assez. J'ai dû récupérer une boîte parce que quelqu'un ne faisait pas attention et a tapé rm -rf *dans /.

* nix suppose que si vous êtes root ou si vous êtes soudainement root, vous savez ce que vous faites. Assurez-vous donc de savoir ce que vous faites avant de le faire.

Une autre solution permettant de s’assurer que votre commande "cd" fonctionne avant de lancer le "rm" consiste à utiliser

cd dontDeleteMe && rm -rf *
utilisateur30619
la source
6
C'est une suggestion dangereuse. Ce que vous voulez, c'est: cd dontDeleteMe && rm -rf *
Izkata
@Izkata Ou assurez-vous que l'opération cd a réussi avant d'émettre la commande rm.
Eliah Kagan
1
@EliahKagan C'est exactement ce que mon extrait de code fait ...
Izkata
En réalité, ce n’est ni plus ni moins dangereux que ce que vous suggérez. Tout ce que && fait, c'est d'enchaîner les deux commandes pour qu'elles s'exécutent en même temps. Si quelque chose que ma méthode est réellement SAFER puisque vous devez vous arrêter et .look avant d'exécuter le rm -rf *. S'arrêter pour vérifier est toujours mieux.
user30619
5
@ user30619 L' &&opérateur ne se contente pas de chaîner les commandes; il faut que chaque commande réussisse avant que la suivante ne soit exécutée. Si la cdcommande échoue pour une raison quelconque (le répertoire n'existe pas, les privilèges, etc.), la rmcommande ne sera pas exécutée. J'appellerais ça plus sûr.
ean5533
0
  1. La chose la plus facile pour moi - un expert Windows mais un novice Ubuntu
  2. Cliquez sur l'icône Fichiers sur le lanceur
  3. Accédez au répertoire dans lequel se trouvent les fichiers et les dossiers à supprimer.
  4. Clic droit dans une zone vide de la fenêtre à côté des fichiers et cliquez sur "Ouvrir dans un terminal" - laissez la fenêtre Fichiers ouverte
  5. Une fenêtre de terminal s'ouvrira et sera "définie" sur le dossier que vous avez localisé
  6. Vous pouvez taper "dir" (ignorer les guillemets quand je dis le type) et appuyer sur entrée pour que le terminal affiche une liste de fichiers et de dossiers - juste pour prouver que vous êtes "dans" le bon dossier
  7. tapez "rm -rf *" et appuyez sur Entrée
  8. en fonction de la taille des dossiers / fichiers à supprimer, le système s'interrompt
  9. Lorsque l'invite du terminal revient, la fenêtre Fichiers que vous avez ouverte va maintenant dire "Le dossier est vide"
  10. J'ai eu du succès avec cette méthode et cela m'a rassuré de voir le fichier / dossier à la fois dans la fenêtre Fichiers et à la suite de la commande Dir dans la fenêtre de terminal
  11. J'étais également rassurée par le fait que la fenêtre Fichiers affichait le dossier maintenant vide, surtout depuis que je cherchais ces fichiers à la recherche du dossier Corbeille dans lequel ils se trouvaient.
  12. Merci à tous ceux qui ont soumis leurs réponses - c'était très instructif
William Saxon
la source
Cela semble assez compliqué - d’autant plus que vous allez finir par courir rm -rf *quand même.
David Foerster
0
rm -rf ${PWD}/*

effacera le répertoire de travail actuel

Nick Mitchell
la source