web-dev-qa-db-fra.com

Comment supprimer tous les sous-répertoires d'un répertoire?

Cette question est une sorte de phase II à la première question que j'ai postée à ici

J'ai un répertoire qui contient un tas de sous-répertoires, des fichiers .Zip et d'autres fichiers aléatoires non contenus dans un sous-répertoire.

J'aimerais qu'un script de ligne de commande supprime tous les sous-répertoires du répertoire parent, mais conserve tous les fichiers Zip et fichiers lâches qui n'appartiennent à aucun sous-répertoire. Tous les sous-répertoires ont du contenu, donc je pense que je devrais forcer leur suppression avec la commande -f.

Donc, fondamentalement, une commande qui regarde à l'intérieur du répertoire parent (ou du répertoire actuel), supprime tous les dossiers de celui-ci, mais conserve tous les autres contenus et fichiers qui ne sont pas un dossier ou contenus dans un dossier.

Je comprends que la suppression d'éléments de la ligne de commande nécessite une attention particulière, mais j'ai déjà pris toutes les précautions nécessaires pour effectuer une sauvegarde à distance.

56
Evster

Dans BASH, vous pouvez utiliser la barre oblique de fin (je pense que cela devrait fonctionner dans n'importe quel shell POSIX):

rm -R -- */

Notez le -- Qui sépare les options des arguments et permet de supprimer les entrées commençant par un trait d'union - sinon, après l'expansion par le Shell, le nom de l'entrée serait interprété comme une option par rm (il en va de même pour de nombreux autres utilitaires de ligne de commande).

Ajoutez l'option -f Si vous ne souhaitez pas être invité à confirmer la suppression des fichiers non inscriptibles.

Notez que par défaut, les répertoires cachés (ceux dont le nom commence par .) Seront laissés seuls.

Une mise en garde importante: l'expansion de */ Inclura également des liens symboliques qui se résoudront éventuellement en fichiers de type . Et selon l'implémentation de rm, rm -R -- thelink/ Supprimera simplement le lien symbolique, ou (dans la plupart d'entre eux) supprimera récursivement conten du répertoire lié mais pas que répertoire lui-même ni le lien symbolique.

Si vous utilisez zsh, une meilleure approche serait d'utiliser un qualificateur glob pour sélectionner uniquement les fichiers de type répertoire:

rm -R -- *(/) # or *(D/) to include hidden ones

ou:

rm -R -- *(-/)

pour inclure des liens symboliques vers des répertoires (mais parce que, cette fois, l'expansion n'a pas de / s, c'est seulement le lien symbolique qui est supprimé avec toutes les implémentations rm).

Avec bash, AT&T ksh, yash ou zsh vous pouvez faire:

set -- */
rm -R -- "${@%/}"

pour supprimer le dernier /.

69
peterph

En plus de la méthode des caractères génériques, vous pouvez également utiliser find (au moins GNU find) pour ce faire:

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R

Comme pour les autres lignes find, vous pouvez exécuter la première partie (find -mindepth 1 -maxdepth 1 -type d) pour voir une liste des répertoires qui seront supprimés.

Une option plus sûre consiste à faire quelque chose comme ceci:

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm
# or
mv -i -t ../to-rm */
# or
mv -i */ ../to-rm

chacun d'entre eux déplacera tout le contenu dans ../to-rm au lieu de le supprimer. Vous pouvez vérifier qu'il a fait ce que vous vouliez, eux rm -Rf ce répertoire à votre guise.

13
derobert

Vous souhaiterez peut-être créer un script pour certaines de ces suggestions, en particulier rm -R -- */, et conservez-le dans votre dossier/usr/local/bin; ou créez un alias dans votre fichier ~/.bashrc. Comme il est donc facile de taper une commande et de casser votre système - même une seule lettre et/ou l'ordre des lettres peut entraîner des conséquences catastrophiques - cela constituerait une solution un peu plus robuste que d'avoir à taper les différentes options et arguments chaque fois que vous souhaitez accomplir cette tâche.

Vous pouvez également inclure le -i or --interactive=once ou -I or --interactive=always option à votre script/commande qui servira d'un autre outil pour éviter les suppressions involontaires.

De plus, quelque chose comme suggéra derobert serait le mieux; il suffit de copier/coller le script dans un fichier/éditeur de terminal et de l'adapter à vos besoins spécifiques, et les fichiers/répertoires seront déplacés dans un seul répertoire (dont vous pouvez vérifier/vérifier le contenu) que vous pouvez simplement supprimer en délivrant le rm -rf commande.

Une autre option consiste à utiliser une application GUI, telle que votre gestionnaire de fichiers, et à sélectionner simplement tous les fichiers/dossiers applicables que vous souhaitez supprimer. Consultez les pages de manuel de votre distribution si vous ne disposez pas des autorisations.

Enfin, si les dossiers sont vides - essentiellement des noms de fichiers simples - vous pouvez utiliser la commande rmdir pour les supprimer. Cela ne fonctionne pas pour tout ce que vous voudrez peut-être supprimer, mais cela vous sera utile lorsque vous voudrez faire du "ménage". ** Vous voudrez peut-être essayer le -p --ignore-fail-on-non-empty option, qui vous permettra de supprimer certains sous-répertoires ainsi que leurs "parents" vides - les répertoires dans lesquels ils résident.

4
ILMostro_7

Vous devez d'abord répertorier les répertoires, puis les supprimer, sans gêner les fichiers normaux, ls -d * /, ne répertorie que les sous-répertoires, et le rediriger avec rm supprime les répertoires et le contenu, en conservant les fichiers volants intacts.

Cette commande devrait faire le travail,

ls -d  */ | xargs rm -rf
1
Ankit Marothi

rm -rf <directory name>. Ça marche. Il suffit de taper rm <directory name> conduit simplement au nombre de sous-questions dans lesquelles chacun des sous-répertoires doit être supprimé manuellement. Mais, rm -rf aide à supprimer le répertoire entier avec ses sous-répertoires à la fois.

0
Riya Melvin