O Bash ampliou a globbing (primeiro teste, depois remove o eco):
shopt -s extglob
echo rm -rf !(A)
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?
O Bash ampliou a globbing (primeiro teste, depois remove o eco):
shopt -s extglob
echo rm -rf !(A)
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;
E sobre:
mv A /tmp/
rm * -rf
mv /tmp/A .
Isso evita alguns dos "problemas" de um erro de digitação nos outros comandos.
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.
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 ...
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.
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
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.
Veja também aqui:
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.