localize todos os diretórios (exceto 'codificado') no diretório de trabalho e exclua todos eles

3

Estou tentando testar este cenário, tenho esses arquivos

/encoded
encode <~~~ a bash script
/dir1
/dir2
.../dir2-sub
test.meta

O que eu desejo é, por find procurar por todos os diretórios em nosso atual (exceto) codificado, em seguida, excluir todos eles

Acabei usando este script:

find . -name encoded -prune -o -maxdepth 10 ! -name 'encode*' ! -name '.*' | xargs rm -rf

O que eu acredito que seja, marque a pasta encoded then -prune , então ela ignoraria, certo? então para qualquer outro, que não tem extensão (o que faz com que todos sejam dir) delete via rm

mas o problema é ... Eu também tenho um script bash sem nome de extensão, então ele acabou sendo deletado

O que eu desejo é que meu bashscript termine da estrutura acima para exatamente como este (mantendo todos os não-dir intactos, não toque na pasta / codificada e seu conteúdo, e não exclua o script codificar bash)

/encoded
encode <~~~ a bash script
test.meta

como posso obter o resultado acima? espero que alguém possa ajudar obrigado!

    
por The Wolf 15.04.2015 / 13:40

1 resposta

5

Você não precisa enumerar recursivamente diretórios para excluí-los com rm -rf ; você pode simplesmente listar os diretórios de nível superior que você deseja excluir. Para determinar se uma entrada de diretório é um diretório em vez de um arquivo, você pode usar find 's -type d test; usar . não é um bom indicador.

O seguinte deve funcionar para você:

find * -maxdepth 0 ! -name encoded -type d -print0 | xargs -0 rm -rf

Isso inicia a partir de todas as entradas no diretório atual (para evitar a listagem . ), descarta qualquer nome cujo nome seja encoded e mantém apenas diretórios; ele exibe o resultado usando um nulo como delimitador e alimenta o resultado em xargs para fornecer a rm -rf . Antes de executar essa variante, tente

find * -maxdepth 0 ! -name encoded -type d

para ver se a saída corresponde ao que você espera.

-prune não ignora sua correspondência, evita descer para ela; Portanto, no seu exemplo, encoded ainda está listado e, em seguida, filtrado pelo -name test.

    
por 15.04.2015 / 14:07