Supposons sous le répertoire actuel, il existe plusieurs sous-répertoires et on est appelé A.
Comment supprimer tous les sous-répertoires sauf un avec bash?
Bash a prolongé le globe global (premier test, puis retirez l'écho):
shopt -s extglob
echo rm -rf !(A)
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;
Qu'en est-il de:
mv A /tmp/
rm * -rf
mv /tmp/A .
Cela évite une partie de la "peur" d'une faute de frappe dans les autres commandes.
Quelque chose comme
find . -type d -not -name A -exec rm -ir {} \;
devrait faire.
éditer
Ça devrait vraiment être
find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;
pour prévenir find
de recouvrer ci-dessous A.
je le fais habituellement en travaillant une commande LS qui le fait d'abord. Je ne suis pas dans une machine Unix, mais quelque chose comme:
ls -lda "[^ a]"
Une fois que vous avez raison, tuez-le à une commande
ls -lda "[^ a]" | xargs rm -rf
N'hésitez pas à éditer ci-dessus si j'ai mon expression régulière mal ...
Si vous voulez être plus flexible mais manuel, vous pouvez faire:
ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r
De cette façon, vous pouvez faire des menaces générales.
Voici une façon. Soyez prudent avec ce genre de chose, cependant, il est si puissant qu'il ne peut être utilisé que pour le bien ou le mal ...
Trouver * -Type D | grep -v "^ a" | xargs rm -rf
N'utilisez pas de trouver comme certaines personnes ont montré avec -exec et RM sans passer -print0 à trouver et -0 à Xargs. Il sera confondu sur les noms de fichiers avec des espaces ou des nouvelles lignes:
$ mkdir 'foo foo'
$ mkdir foo$'\n'foo
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory
Utilisez plutôt Rechercher -Print0 avec Xargs -0, '-exec Commande {} +' ou -Delete si votre recherche prend en charge.