Je veux supprimer les répertoires B et D. Mais je veux garder C et tous ses fichiers et répertoires descendants. Quelle est la commande pour supprimer tous les répertoires enfants d'un répertoire parent, sauf un répertoire et ses enfants.
Aide appréciée.
filesystem
directory
directory-structure
Joe Saad
la source
la source
A
dans votre exemple)? Les supprimer également ou les conserver?Réponses:
Ce que vous voulez, c'est cette commande:
Démo:
Explication:
find DIRECTORY
appeler la commande find pour opérer sur RÉPERTOIRE-mindepth 1
: fonctionne uniquement avec le contenu du répertoire, évitez le répertoire lui-même qui est de niveau 0-maxdepth 1
: empêche de descendre dans les sous-répertoires (rm -rf
est récursif de toute façon, nous n'avons donc pas besoin de descendre dans les sous-répertoires pour les supprimer)-type d
: recherche uniquement les répertoires-not \( -name "keepMe" \)
ignorer l'élément portant le nom que vous souhaitez conserver-exec rm -rf {} \;
effectuer la suppression sur chaque élément trouvéla source
find
est un bon ami ici, mais Bashfor
ettest
sont de meilleurs amis ...>: - DUtilisation des fonctionnalités glob étendues du shell bash (qui sont activées par défaut dans les installations Ubuntu actuelles), étant donné
vous pouvez aborder tout ce qui exclut
C
et son contenu en utilisant l'expression globA/!(C)
ieDonc, pour tout supprimer sauf le répertoire
C
et son contenu, vous pouvez simplement utiliseren quittant
la source
('"
lorsque je l'exécute à distance viassh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
. Des idées? Merci beaucoup.extglob
option shell n'est activée que pour les shells interactifs - je ne sais pas si vous pouvez forcerssh
à le faireUne façon simple serait d’utiliser trash-cli
vous pouvez l'installer avec
sudo apt-get install trash-cli
une fois installé, vous pouvez naviguer vers le répertoire parent A avec
cd /A
puis lancer la commandetrash B D
où B et D sont les répertoires que vous souhaitez supprimer (ils se retrouveront dans la corbeille du lecteur sur lequel ils se trouvent, donc si vous faites une erreur, vous pouvez récupérer les fichiers)Testé sous Ubuntu 16.04 et 14.04
la source
trash ! C
?trash: cannot trash non existent
! ''extglob
cependant l' activer .Utilisez simplement la
for
boucle de Bash ettest
pour filtrer les répertoires souhaités et larm -rf
commande pour supprimer récursivement les répertoires, comme ceci:Cela itère sur tous les éléments (fichiers et répertoires) à l'intérieur
/path/to/parent/
et supprime l'élément récursivement si son nom n'est pas égal àdir_survive
. Si le répertoire parent est le répertoire actuel, vous ne pouvez écrire qu'en*
tant que chemin.Si vous n'êtes pas sûr et que vous souhaitez tester les éléments qui seront supprimés en premier sans effectuer aucune action, remplacez simplement le
rm -rf
dans la commande ci-dessus parecho
et il ne produira que les candidats à la suppression.Voici un exemple d'exécution:
la source