Criando uma lista de arquivos, removendo “duplicatas” com sufixo diferente

1

Eu tenho um problema que (eu acho) requer um pouco de script-magic - não sei o que seria melhor ...

Eu tenho um diretório com muitas imagens em diferentes formatos - jpg, gif, png, tiff e svg.

Alguns (não todos!) dos arquivos png e svg estão em pares - ie. um png e uma versão svg da mesma imagem, ambos com o mesmo nome de arquivo, exceto que o sufixo difere (por exemplo, figleaf.png e figleaf.svg).

Eu preciso de um script que pegue a lista de arquivos (feita por ls ), e remova a versão svg de todos os gêmeos, deixando apenas a versão png. Todos os outros arquivos (não gêmeos) - incluindo arquivos svg sem um gêmeo png - devem permanecer na lista (junto com a versão png dos gêmeos). Como alternativa, um script que cria uma lista de todos os arquivos svg com um png-twin correspondente.

Eu acho que alguns dos gêmeos podem ter pequenas diferenças entre as versões - por exemplo. figleaf.png e FigLeaf.svg - então seria ótimo se o script pudesse ser opcionalmente alterado para ignorar o caso das letras.

    
por Baard Kopperud 23.12.2014 / 17:28

2 respostas

3

Você poderia fazer isso usando o bash / ksh:

for i in *.svg; do test -e "${i%.*}.png" && rm "$i"; done

Ou formatado de forma diferente:

for i in *.svg; do
    test -e "${i%.*}.png" && rm "$i"
done

Substitua o rm por echo para teste antes de fazer a exclusão real.

EDITAR:

sputnick acabou de editar uma solução muito semelhante a esta na sua resposta, você deve levar a dele como ele foi o primeiro a responder.

    
por 23.12.2014 / 17:51
3

Tente fazer isso usando :

(remova o modificador i na substituição se quiser diferenciar maiúsculas e minúsculas)

$ perl -e '
    foreach my $file (<*.png>) {
       ($ext_free = $file) =~ s/\.png//i;
       unlink "$ext_free.svg" if -e "$ext_free.svg";
    }
' *.[Pp][Nn][Gg]

Para experimentar, coloque um print em vez de unlink .

ou usando :

shopt -s nocaseglob # case insensitive
# use 'shopt -u nocaseglob' for case sensitive
for file in *.png; do
    [[ -e ${file%.png}.svg ]] && rm -f "${file%.png}.svg"
done
    
por 23.12.2014 / 17:44