Correção recursiva de extensões de arquivos de imagem no Linux

5

Eu tenho um monte de arquivos de imagem de digitalizações / faxes erradas que preciso consertar para nossos usuários de Linux. Acontece que temos um monte de varreduras que são arquivos PNG que são rotulados como * .jpg vice-versa. No Windows, isso nunca foi um problema, pois o Explorer / Office simplesmente ignoraria a extensão. Mas no Linux, o Eye of GNOME etc acaba se recusando a abrir o arquivo porque o conteúdo não combina com a extensão.

Alguém tem alguma recomendação para uma ferramenta ou um pequeno pedaço de script que poderia fazer isso? Eu poderia escrever um programa em C para fazer isso, mas isso parece um pouco exagerado. Apenas sentar e renomear manualmente manualmente não é uma opção, existem milhares.

Edit: Eu vejo o comando file irá olhar para o conteúdo real do arquivo e exibir o que é. Não sei bem como usar as informações dele.

    
por BlamKiwi 16.09.2014 / 14:51

2 respostas

9

Você desejará iterar os arquivos que se parecem com os arquivos de imagem, chamar file para ver o que eles realmente são e renomeá-los apropriadamente

for f in *.{jpg,JPG,png,PNG,jpeg,JPEG}; do 
    type=$( file "$f" | grep -oP '\w+(?= image data)' )
    case $type in  
        PNG)  newext=png ;; 
        JPEG) newext=jpg ;; 
        *)    echo "??? what is this: $f"; continue ;; 
    esac
    ext=${f##*.}   # remove everything up to and including the last dot
    if [[ $ext != $newext ]]; then
        # remove "echo" if you're satisfied it's working
        echo mv "$f" "${f%.*}.$newext"
    fi
done
    
por 16.09.2014 / 15:08
-3

ls | grep "png" | awk 'BEGIN{FS="\."}{print $1".png " $1".jpg"}'|xargs mv

Obvs você tem que mudar a primeira parte antes do awk para encontrar seus arquivos png. E isso não funcionará se você tiver mais de 1 . no caminho.

Isso provavelmente não é uma solução que funcionará em seu caso específico imediatamente, mas há todas as peças de que você precisa. Se você me der mais detalhes ou, melhor ainda, uma impressão de uma lista de todos os arquivos que precisa ser mudado, então eu poderia mudar o comando exatamente para você.

EDIT # 1: Eu não percebi que ele precisava examinar o conteúdo do arquivo para saber quais estão errados, achei que ele conhecia a lista de arquivos nomeados incorretamente.

EDIT # 2: Comentadores parecem estar obcecados com a parte do código antes do awk. Eu pensei que estava claro o suficiente com a minha primeira frase, mas desde que eu não estava; Você terá que fornecer o código antes do awk que listará adequadamente seus arquivos. Além disso, isso foi planejado como um exemplo básico de como você poderia começar a realizar uma tarefa como essa por conta própria. Admiti que quase certamente não funcionaria copiando e colando.

Você aprenderá mais preenchendo e trabalhando com a solução real do que aplicando cegamente linhas da Internet. Se você ainda está preso neste ponto, fique à vontade para comentar e eu posso tentar ajudar.

    
por 16.09.2014 / 15:14