Elimina tutte le sottodirectory tranne una


10

Supponiamo che nella directory corrente ci siano più sottodirectory e una si chiama A.

Come eliminare tutte le sottodirectory tranne A con Bash?

Risposte:


23

Bash ha esteso il globbing (prima prova, quindi rimuovere l'eco):

shopt -s extglob
echo rm -rf !(A)

(prima che me ne dimentichi - potresti disabilitare il completamento della cronologia dello stile CSH, in Bash3 c'è un bug mentre ignori! (. set + H

+1 Bash se pieno di sorprese! A volte sono carini come questo.
Aleksandr Levchuk,

Wauw davvero molto bello! Funziona come previsto. Con shopt | grep extPuoi vedere se il plugin è abilitato.
danger89,

14
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

10

Che dire:

mv A /tmp/
rm * -rf
mv /tmp/A .

Questo evita un po 'della "paura" di un refuso negli altri comandi.


1
+1 per fare la cosa sana invece di sperare che gli strumenti siano abbastanza intelligenti. ancora, una notte, mentre stavo imparando Linux, ho copiato il kernel in / tmp prima di fare il mio primo ricompilare. non è riuscito, ma ho cancellato quello vecchio, quindi ho detto 'niente sudore, ne ho una copia' solo per scoprire che un'attività cron di mezzanotte l'aveva cancellato con ogni file più vecchio di una settimana in / tmp! ho dovuto ricompilare di nuovo e questa volta farlo bene, o non riavviare per me!
Javier

migliore risposta inviata :)
warren

3

Qualcosa di simile a

find . -type d -not -name A -exec rm -ir {} \;

dovresti ... dovrebbe.

modificare

Dovrebbe essere davvero

find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;

per impedire il findripetersi al di sotto di A.


3
Tuttavia, ciò eliminerebbe anche qualsiasi sottodirectory sotto A come A / foo e A / bar, ma preserverebbe A / A.
TCampbell

Freddo! Le domande e le risposte vengono migrate da SO a SF ... ma la mia modifica sopra è andata persa ...
agnul

Dovrebbe essere meglio scambiare maxdepth e digitare argomenti come questo: find. -maxdepth 1 -type d -not -name A -exec rm -ir {} \;
Spawnrider,

1

di solito lo faccio elaborando un comando ls che lo fa per primo. non sono su una macchina unix, ma qualcosa del tipo:

ls -lda "[^ A]"

Una volta capito bene, esegui il pipe ad un comando

ls -lda "[^ A]" | xargs rm -rf

Sentiti libero di modificare sopra se ho sbagliato la mia espressione regolare ...



1

Se vuoi essere più flessibile ma manuale puoi fare:

ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r

In questo modo puoi fare il munging generale.


1

Ecco un modo. Fai attenzione a questo genere di cose, tuttavia, è così potente che può essere usato solo per il bene o il male ...

trova * -type d | grep -v "^ A" | xargs rm -rf

1

Non usare find come alcune persone hanno mostrato con -exec e rm senza passare -print0 per trovare e -0 per xargs. Verrà confuso sui nomi dei file con spazi o newline:

$ 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

Usa invece find -print0 con xargs -0, '-exec command {} +' o -delete se la tua ricerca lo supporta.



1

Oltre all'esempio precedente di:

find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

puoi anche fare:

find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \;

per evitare di dover cd some/subdirprima.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.