Remove arquivos e diretórios, mesmo que não estejam vazios, exceto alguns diretórios

2

Estou tentando remover todo o conteúdo de um diretório com algumas exclusões. Atualmente estou usando isso:

find . -type f | grep -vZf ../../exclude.file | xargs rm -rf

O exclude.file contém:

*log*
world*
crash-reports
banned-ips*

Eu não quero remover as pastas world , log ou crash-reports ou qualquer um dos seus conteúdos (o * é para cobrir os backups, que são gerados como world.zip ).

O comando acima faz isso, mas não remove diretórios não vazios. Por exemplo. o diretório Config é deixado, mas preciso removê-lo.

Eu também experimentei semelhante ao seguinte:

find -maxdepth 0 -not -name '*log*' -not -name 'crash-reports' -not -name 'world*' | xargs rm -rf

Mas ainda recebo o mesmo resultado.

Existe uma maneira de fazer isso?

    
por Andrew Wright 03.07.2014 / 13:56

2 respostas

2

-type f só encontrará arquivos, não diretórios. -maxdepth 0 sempre encontrará o diretório em que você está procurando ( . ). Você terá que encontrar os arquivos que você realmente quer passar para rm .

A maneira padrão de fazer isso é excluir diretórios e todos os seus conteúdos como este (não testado!):

find . -mindepth 1 \( -name '*log*' -o -name 'crash-reports' -o -name 'world*' \) -prune -o -print
    
por 03.07.2014 / 14:01
0

O que você quer não é possível IMHO com uma única execução de find , a menos que você saiba que todos os diretórios a serem ignorados estão no primeiro nível de diretório.

primeiro passo

Na primeira execução, exclua todos os arquivos (ou não: não diretórios):

find . \( -type d \
  \( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
  -prune \) -o \( -type d -o -print \)

segundo passo

Crie um arquivo fictício em cada diretório (sub) a ser ignorado:

find . -type d \( \
  \( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
  -o \( -path '*/*log*/*' -o  -path '*/world*/*' -o  -path '*/crash-reports/*' -o  -path '*/banned-ips*/*' \) \) \
  -exec touch {}/dontdeletethisdirecory

terceiro passo

Agora todos os diretórios vazios podem ser excluídos. A abordagem simples é passar todos os diretórios para rmdir . Apenas os vazios são excluídos:

find . -depth -type d -exec rmdir {} \;

último passo opcional

Agora você pode excluir os arquivos fictícios:

find . -type -f -name dontdeletethisdirecory -delete
    
por 03.07.2014 / 14:17

Tags