73 votes

Comment supprimer uniquement les répertoires et ne pas toucher aux fichiers ?

J'ai des centaines de répertoires et de fichiers dans un seul répertoire.

Quelle est la meilleure façon de supprimer uniquement des répertoires (peu importe si les répertoires contiennent quelque chose ou non, il suffit de les supprimer tous) ?

Actuellement, j'utilise ls -1 -d */ et les enregistrer dans un dossier, et faire sed et ensuite l'exécuter. C'est un chemin assez long. Je cherche un meilleur moyen de supprimer uniquement les répertoires.

230voto

Cas Points 691

Pour supprimer tous les répertoires et sous-répertoires et ne laisser que les fichiers dans le répertoire de travail, j'ai trouvé que cette commande concise fonctionne pour moi :

rm -r */

Il utilise le caractère générique de bash */ où étoile suivie d'une barre oblique ne correspond qu'aux répertoires et sous-répertoires.

14 votes

Pour sauter les questions y/n : rm -rf */

1 votes

Gardez à l'esprit l'expansion lorsque vous utilisez ceci dans un script, car les astérisques ne se développeront pas entre guillemets. Tel quel, il devrait fonctionner correctement. unix.stackexchange.com/questions/156534/

2 votes

C'est la réponse la plus votée, mais je l'ai testée parce que j'essaie de faire la même chose, mais je pense que cette réponse supprime tout et ne fait pas ce que la question originale demande. Faites attention en l'utilisant. La réponse du profil de Catalint/Jeremy répond mieux à la question, du moins pour moi. Dans mon cas, j'ai quelques dossiers contenant des fichiers que je veux conserver, mais aussi un tas de dossiers inutiles que je veux supprimer. find . -maxdepth 1 -mindepth 1 -type d est une meilleure option

29voto

catalint Points 419

find . -maxdepth 1 -mindepth 1 -type d

puis

find . -maxdepth 1 -mindepth 1 -type d -exec rm -rf '{}' \;

Pour ajouter une explication :

find démarre dans le répertoire courant grâce à . et reste dans le répertoire courant uniquement avec -maxdepth y -mindepth tous deux réglés sur 1 . -type d dit à find pour ne correspondre qu'aux choses qui sont des répertoires.

find a également un -exec qui peut transmettre ses résultats à une autre fonction, dans ce cas-ci rm . le '{}' \; est la façon dont ces résultats sont transmis. Voir cette réponse pour une explication plus complète de ce qu'est la {} y \; faire

13voto

onteria_ Points 18947

D'abord, courir :

find /path -d -type d

pour s'assurer que la sortie a l'air saine, alors :

find /path -d -type d -exec rm -rf '{}' \;

-type d ne recherche que les répertoires, alors -d s'assure de placer les répertoires enfants avant le parent.

0 votes

La première commande ne fonctionne même pas pour moi. > find . -d -type -d find : warning : the -d option is deprecated ; please use -depth instead, because the latter is a POSIX-compliant feature. find : invalid argument -d to -type

1 votes

@Anthony vous avez un trait d'union supplémentaire. Il devrait être find /path -d -type d

0 votes

Une réponse géniale !

1voto

Kuldeep Darmwal Points 86

C'est très simple.

rm -rf `ls -d */`

0 votes

Comme d'autres l'ont fait remarquer, cela ne fonctionnera pas si vos noms de répertoire contiennent des espaces.

-19voto

Mouse Food Points 211

En une ligne :

rm -R `ls -1 -d */`

(guillemets)

5 votes

Ne pipez pas la sortie de ls ; notamment pas à rm -r . Il échoue lorsque les noms de chemin contiennent des espaces.

1 votes

N'a pas pris en compte la question de l'espace. Je m'en souviendrai.

0 votes

Beaucoup plus recommandé et simple cette réponse

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X