Como excluir diretórios sem links simbólicos em uma pasta

2

Eu tenho esta estrutura de pastas:

build.1
build.2
build.3
build.4
current -> symlink to build.4
previous -> symlink to build.3

Eu estou executando o debian, qual é a maneira correta de deletar cada compilação (= pasta) que não tenha link simbólico para ele?

    
por Karsten 30.06.2012 / 20:53

2 respostas

4

Como Bron disse, não existe uma maneira oficial de fazê-lo (mais strongmente: não pode haver um devido ao design do sistema de arquivos, você só pode rodar o seu próprio). Isto seria como eu iria script-lo no bash (assumindo a estrutura atual, o fgrep é muito branda para ser usado em geral):

# Current list of symlinks (will return build.3 and build.4 in this case)
symed='ls -1 | xargs -l readlink';
# Loop over all build directories
for dir in build.*;
do
    # Either it's a known symlink, or we remove it
    fgrep -q $dir <<< $symed || rm -rf $dir;
done
    
por 30.06.2012 / 21:04
3

Não é tanto uma maneira "correta", mas com que frequência você está fazendo isso? Minha abordagem usual seria executar um pequeno pedaço de Perl (escolha seu próprio veneno), que leu o conteúdo do diretório, examinou os links simbólicos e construiu uma lista de diretórios para excluir.

Não há metadados sobre o destino de um link simbólico que informa que está sendo vinculado.

Você também deve se preocupar com as condições da corrida - se uma tarefa separada estiver atualizando os links simbólicos, não será necessário excluir o novo diretório antes que ele seja vinculado!

    
por 30.06.2012 / 20:59