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

45

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 supprimer les sous-répertoires "1", "2" et "3" et tous les fichiers qu'il contient, sans supprimer le répertoire parent "dontDeleteMe"?

    
posée user784637 26.10.2011 - 18:52
la source

10 réponses

59

Pour supprimer tout dans un répertoire sans supprimer le répertoire, tapez:

rm -rfv dontDeleteMe/*

Veuillez noter que la partie /* est très importante. Si vous placez un espace avant * , tous vos fichiers seront supprimés de votre répertoire actuel.

Soyez également prudent lorsque vous jouez avec rm , -r et * dans la même commande. Ils peuvent être une combinaison désastreuse.

Mise à jour: OK, j'ai réalisé que si vous aviez des fichiers cachés / pointés [noms de fichiers avec des points au début, e.x. .hidden ] alors cela laissera ces fichiers intacts.

En réalité, la solution la plus simple à la question d'origine est la suivante: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Une autre méthode consisterait à utiliser l'option find ou le tube -exec dans xargs (ci-dessous):

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

    
réponse donnée Matt 26.10.2011 - 19:23
la source
27

La seule raison pour laquelle rm -r ./* ne fonctionne pas toujours est que vous pouvez avoir des fichiers et / ou un dossier cachés qui ne correspondent pas à * .

À cette fin, bash fournit une option pour que * corresponde à tout, même aux objets cachés:

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

Il peut être utile de réinitialiser dotglob à son état par défaut (non défini), si vous continuez à utiliser le shell sur lequel vous avez exécuté les commandes ci-dessus:

shopt -u dotglob 
    
réponse donnée enzotib 26.10.2011 - 19:33
la source
20

Ouvrir le terminal ( Ctrl + Alt + T ) taper ceci:

find somedir -mindepth 1 -delete

Cela correspond à tous les fichiers et répertoires de somedir et de ses (grands) enfants, y compris les fichiers "cachés" mais à l'exclusion de somedir lui-même en raison de -mindepth 1 , puis de -delete .

    
réponse donnée guciek 29.09.2012 - 13:48
la source
6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

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

    
réponse donnée Sergey 26.10.2011 - 19:36
la source
4

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

rm -rf dontdelete/*
    
réponse donnée kyleN 26.10.2011 - 19:23
la source
4

Vous pouvez utiliser find avec l’indicateur -delete :

find dontDeleteMe/* -delete

Le /* est important car il indique à find de rechercher uniquement dans le dossier appelé "dontDeleteMe".

Vérifiez également que l’indicateur -delete se trouve à la fin de la commande find .

    
réponse donnée SaultDon 27.10.2011 - 04:09
la source
3
rm -rf  directory/{.*,/*}

Ce qui dit:

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

Bien que Neftas , cette solution n’est pas sûre!

Solution plus sûre:

 rm -rf directory/!(.|..)
    
réponse donnée Tebe 14.04.2015 - 23:36
la source
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

    
réponse donnée user353305 15.09.2015 - 15:17
la source
1

Il existe une réponse encore plus simple:

  1. cd dontDeleteMe

  2. rm -rf *

Temps de lecture de l’administration système de base: Soyez attentif à l’endroit où vous vous trouvez lorsque vous utilisez des commandes de balayage telles que celle-ci.

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

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

Une alternative qui permet à votre commande 'cd' de fonctionner avant que vous n'émettiez le 'rm' est d'utiliser

cd dontDeleteMe && rm -rf *
    
réponse donnée user30619 26.10.2011 - 21:09
la source
0
  1. La chose la plus facile pour moi - un expert Windows, mais un débutant ubuntu
  2. Cliquez sur l’icône Fichiers du lanceur
  3. Accédez au répertoire où se trouve le les fichiers et dossiers que vous souhaitez supprimer sont situés
  4. Clic droit dans une zone vide de la fenêtre à côté des fichiers et cliquez sur "Ouvrir dans le terminal" - laissez la fenêtre Fichiers ouverte
  5. Une fenêtre de terminal s’ouvrira et sera "définie" dans le dossier que vous avez trouvé
  6. Vous pouvez taper "dir" (ne pas tenir compte des citations lorsque je dis taper) 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 pour supprimer le système sera mis en pause
  9. Lorsque l'invite du terminal retourne, la fenêtre Fichiers que vous avez ouverte indiquera désormais "Le dossier est vide"
  10. J'ai eu du succès avec cette méthode et cela m'a rassuré de voir les fichiers / dossiers à la fois dans la fenêtre Fichiers et à la suite de la commande Dir dans la fenêtre du terminal
  11. On m'a également rassuré que la fenêtre Fichiers affiche le dossier maintenant vide - surtout depuis que je cherchais ces fichiers à la recherche du dossier de la corbeille dans lequel ils se trouvaient
  12. Merci à tous ceux qui ont répondu - c'était très instructif
réponse donnée William Saxon 08.11.2016 - 10:12
la source

Lire d'autres questions sur les étiquettes