web-dev-qa-db-fra.com

Supprimer tous les sous-répertoires sauf un

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?

10
Shore

Bash a prolongé le globe global (premier test, puis retirez l'écho):

shopt -s extglob
echo rm -rf !(A)
23
TheBonsai
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;
14
dotjoe

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.

10
Brent

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.

3
agnul

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 ...

1
Tim Hoolihan

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.

1
Joe Beda

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 
1
Don Branson

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.

1
Kyle Brandt