Cette question est une sorte de phase II à la première question que j'ai posée ici
J'ai un répertoire qui contient un tas de sous-répertoires, fichiers .zip et 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 les fichiers en vrac qui n'appartiennent à aucun sous-répertoire. Tous les sous-répertoires ont un contenu, je pense donc que je devrais forcer leur suppression avec la commande -f.
Donc, en gros, une commande qui regarde dans le répertoire parent (ou le répertoire actuel) supprime tous les dossiers de celui-ci, mais conserve tout le contenu et les fichiers qui ne sont ni un dossier ni 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.
-r
,-R
,--recursive
Sont synonymes signifiant « supprimer des répertoires et leur contenu récursive ».rm -R ./*/
- Cela évite également les problèmes de noms de trait d'union.En plus de la méthode générique, vous pouvez également utiliser
find
(au moins GNU find) pour faire ceci:Comme avec les autres
find
lignes, vous pouvez exécuter la première partie (find -mindepth 1 -maxdepth 1 -type d
) pour afficher une liste des répertoires à supprimer.Une option plus sûre consiste à faire quelque chose comme ceci:
N'importe lequel d'entre eux déplacera tous les éléments au
../to-rm
lieu de les supprimer. Vous pouvez vérifier qu'il a bien fait ce que vous vouliez,rm -Rf
ce répertoire à votre guise.la source
to-rm
etfind
qui gère bien les répertoires commençant par un point (en plus de tout autre échappement fastidieux). :)Vous voudrez peut-être créer un script pour certaines de ces suggestions, en particulier
rm -R -- */
, et le conserver dans votre dossier / usr / local / bin; ou créez unalias
dans votre fichier ~ / .bashrc. Puisqu'il est si facile de faire une erreur de frappe avec une commande et de casser votre système (même une seule lettre et / ou l'ordre des lettres peuvent avoir des conséquences catastrophiques), cela constituerait une solution un peu plus robuste que de devoir taper les différentes options et arguments chaque fois que vous voulez accomplir cette tâche.En outre, vous souhaiterez peut-être inclure l' option
-i or --interactive=once
ou-I or --interactive=always
dans votre script / commande, ce qui servira d'autre outil pour éviter les suppressions involontaires.En outre, quelque chose comme derobert suggéré serait le mieux; copiez / collez simplement le script dans un éditeur de fichier / terminal et ajustez-le à vos besoins spécifiques. Les fichiers / répertoires seront alors déplacés dans un seul répertoire (dont vous pourrez vérifier / vérifier le contenu) que émettre la
rm -rf
commande.Une autre option consiste à utiliser une application graphique, telle que votre gestionnaire de fichiers, et à sélectionner simplement tous les fichiers / dossiers applicables que vous souhaitez supprimer. Vérifiez les pages de manuel de votre distribution si vous n'avez pas les permissions.
Enfin, si les dossiers sont vides (essentiellement des noms de fichiers simples), vous pouvez utiliser la
rmdir
commande pour les supprimer. Cela ne fonctionne pas pour tout ce que vous voulez supprimer, mais cela vous sera utile lorsque vous voudrez faire du "ménage". ** Vous voudrez peut-être essayer l'-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.la source
Tout d’abord, vous devez lister les répertoires puis les supprimer, sans entraver les fichiers normaux. Ls -d * / ne répertorie que les sous-répertoires. Le fait de le diriger avec rm supprime les répertoires et le contenu, tout en préservant les fichiers perdus.
Cette commande devrait faire le travail,
la source
rm -rf -- */
?printf '%s\0' */ | xargs -r0 rm -rf --
aiderait (dans les shells oùprintf
est intégré et nonls
) à contourner la liste arg de trop grandes erreurs, maisls -d */ | xargs rm -rf
n’ajoute rien AFAICT sauf des problèmes supplémentaires." .."
(espace..
), le contenu du répertoire parent serait supprimé avec certainesls
implémentations. Et ce ne sont pas seulement des espaces, ce sont aussi d'autres caractères vierges, nouvelle ligne, guillemets simples, guillemets doubles, barres obliques inversées et noms de fichiers commençant par-
.printf
pour générer une liste dans laquelle chaque nom est terminé par un caractère nul afin qu'il puisse être traitéxargs
avec l'-0
option, je vous conseillerais de modifier votre réponse pour la mettre à jour avec sa variante. Je serais assez confiant dans le fait qu'il serait heureux que vous utilisiez son extrait de code si vous le comprenez bien et avez compris comment il protège contre les comportements indésirables provoqués par certains noms de fichiers potentiellement existants.xargs
présente un avantage par rapport à la réponse acceptée (cela fonctionne quand il y a un très grand nombre de fichiers / répertoires dans le répertoire en cours), il est donc possible de l'éditer en une réponse utile. Personnellement, j’ai trouvé que répondre aux questions de Stack Exchange était une bonne expérience d’apprentissage, en particulier lorsque j’obtenais un retour utile d’autres utilisateurs.rm -rf <directory name>
. Ça marche. Lerm <directory name>
simple fait de taper 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.la source