Exclua todos os subdiretórios, exceto um

10

Suponha que sob o diretório atual, existem vários subdiretórios, e um é chamado de A

.

Como excluir todos os subdiretórios, exceto A com Bash?

    
por 7 revs, 4 users 43%anon 16.11.2010 / 03:57

10 respostas

22

O Bash ampliou a globbing (primeiro teste, depois remove o eco):

shopt -s extglob
echo rm -rf !(A)
    
por 04.06.2009 / 21:28
14
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;
    
por 04.06.2009 / 21:39
7

E sobre:

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

Isso evita alguns dos "problemas" de um erro de digitação nos outros comandos.

    
por 04.06.2009 / 21:50
3

Algo como

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

deve fazer.

editar

Deve ser realmente

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

para evitar que find seja recursivo abaixo de A.

    
por 04.06.2009 / 21:46
1

Eu geralmente faço isso trabalhando em um comando ls que acerta primeiro. Eu não estou em uma máquina unix, mas algo como:

ls -lda "[^ A]"

Depois de acertar, canalize-o para um comando

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

Sinta-se à vontade para editar acima se minha expressão regular estiver errada ...

    
por 04.06.2009 / 21:24
1

Se você quer ser mais flexível, mas manual, você pode fazer:

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

Dessa forma, você pode fazer um trabalho geral.

    
por 04.06.2009 / 21:24
1

Aqui está um jeito. Tenha cuidado com esse tipo de coisa, porém, é tão poderoso que só pode ser usado para o bem ou para o mal ...

find * -type d | grep -v "^A" | xargs rm -rf
    
por 04.06.2009 / 21:24
1

Não use find como algumas pessoas mostraram com -exec e rm sem passar -print0 para encontrar e -0 para xargs. Será confundido com nomes de arquivos com espaços ou novas linhas:

$ 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

Em vez disso, use find -print0 com xargs -0, '-exec command {} +', ou -delete se seu find o suportar.

    
por 04.06.2009 / 21:43
1

Veja também aqui:

link

    
por 23.05.2017 / 14:41
1

Além do exemplo anterior de:

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

você também pode fazer:

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

para evitar ter que cd some/subdir primeiro.

    
por 18.01.2015 / 14:16

Tags