web-dev-qa-db-fra.com

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

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"?

50
user784637

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

rm -rfv dontDeleteMe/*

Veuillez 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.

Faites également très attention en jouant avec rm, -r et * dans la même commande. Ils peuvent être une combinaison désastreuse.

Mise à jour: OK, je me suis rendu compte que si vous avez des fichiers cachés/points [noms de fichiers avec des points au début, par exemple, x.x. .hidden] alors cela laissera ces fichiers intacts.

La solution la plus simple à la question initiale est donc: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Une autre solution consisterait à utiliser l'option -exec de find ou de la transmettre à xargs (ci-dessous):

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

64
Matt

La seule raison pour laquelle rm -r ./* ne fonctionne pas toujours est qu’il est possible que des fichiers et/ou des dossiers cachés ne correspondent pas à *.

À cette fin, bash fournit une option permettant de faire correspondre * à 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 où vous avez exécuté les commandes ci-dessus:

shopt -u dotglob 
28
enzotib

Terminal ouvert (Ctrl+Alt+T) tapez ce qui suit:

find somedir -mindepth 1 -delete

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

22
guciek
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

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

6
Sergey

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

rm -rf dontdelete/*
4
kyleN

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".

Assurez-vous également que l'indicateur -delete figure à la fin de la commande find.

4
SaultDon
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 gentiment noté par Neftas cette solution n'est pas sans danger!

La solution plus sûre est:

 rm -rf directory/!(.|..)
3
Tebe

Il y a une réponse encore plus simple:

  1. cd dontDeleteMe

  2. rm -rf *

Durée de la lecture de l’administration système de base: Assurez-vous de faire attention à votre position 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 saisi rm -rf * pendant que je suis 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 autre solution permettant de s’assurer que votre commande "cd" fonctionne avant de lancer le "rm" consiste à utiliser

cd dontDeleteMe && rm -rf *
1
user30619

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 tout

1
user353305
rm -rf ${PWD}/*

effacera le répertoire de travail actuel

0
Nick Mitchell
  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 indique maintenant "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 affiche le dossier maintenant vide - surtout 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
0
William Saxon