Ao executar 'rm -rf', é possível excluir determinados subdiretórios?

4

Eu uso rotineiramente montagens de bind para ajudar a disponibilizar espaço em vários locais sem ter vários volumes lógicos / partições físicas / LUNs, etc.

Por exemplo, posso ter um 200G LV montado em /space . De lá, eu criarei subdiretórios como var_opt e var_log , que eu posso vincular a montagem a /var/opt e /var/log , respectivamente.

Ao fazer uma limpeza no diretório 'space', é possível excluir os diretórios de um rm -rf em execução dentro de /space ?

Exemplo:

# pwd
/space
# rm -rf * {except-for-var_opt-and-var_log}

Existe uma maneira diferente ou melhor (mas igualmente simples) de realizar o que eu estou tentando fazer que eu não tenha pensado?

    
por warren 28.09.2010 / 15:12

4 respostas

1

Talvez com a combinação find + xargs + rm?

find /space ! -iregex '(var_opt|var_log)' | xargs rm -f

ou algo nesse tom. É claro que pode ser aconselhável primeiro instruir os xargs a executar algo mais inofensivo, como o echo, antes de alterá-lo para rm ...

    
por 28.09.2010 / 15:16
11

Conceitualmente simples e com baixo risco de erro:

mkdir TO_DELETE
mv * TO_DELETE
mv TO_DELETE/var_opt TO_DELETE/var_log .
rm -rf TO_DELETE

Você também pode usar os globs estendidos do ksh:

rm -rf !(var_opt|var_log)

Estes também estão disponíveis no bash se você ativá-los:

shopt -s extglob
rm -rf !(var_opt|var_log)

Idem em zsh:

setopt ksh_glob
rm -rf !(var_opt|var_log)

O Zsh também tem seus próprios globs estendidos:

setopt extended_glob
rm -rf ^var_(opt|log)
    
por 29.09.2010 / 01:10
2

Se os nomes dos arquivos de entrada forem gerados pelos usuários, você precisará lidar com nomes de arquivos surpreendentes contendo espaço, 'ou "no nome do arquivo.

O uso de xargs pode levar a surpresas desagradáveis devido ao problema do separador .

O GNU Parallel não tem esse problema.

find /space ! -iregex '(var_opt|var_log)' | parallel -X rm -f

Assista ao vídeo de introdução do GNU Parallel para saber mais.

    
por 29.09.2010 / 00:47
1

Se os diretórios que você deseja preservar forem exatamente os pontos de montagem, você poderá usar --one-file-system no GNU rm .

Eu não investiguei como isso é implementado, mas estou supondo que isso não fará o que você quer se a montagem de bind for do mesmo sistema de arquivos, então tenha cuidado! rm não tem a opção --no-act , mas você pode canalizar yes no | rm -ir . , por exemplo.

    
por 27.04.2016 / 18:47