Eu tenho cerca de 12000 imagens de diferentes tipos de arquivos, mas cada uma delas foi renomeada como * .jpg.
Agora, quero devolver as extensões apropriadas, como posso fazer isso
files
file-format
akabhirav
fonte
fonte
Respostas:
Você pode fazer isso com relativa facilidade no bash:
Esta é a mesma idéia que a resposta da @ AB, mas usando shell globs em vez de
find
. O${f%%.*}
é o nome do arquivo sem sua extensão. A-0
dofile
comando torna imprimir um\0
após o nome do arquivo que então usar paragrep
o tipo de arquivo. Isso deve funcionar com nomes de arquivos arbitrários, incluindo aqueles que contêm espaços, novas linhas ou qualquer outra coisa. O${type,,}
truque é obter extensões em minúsculas. Seria convertidoPNG
parapng
.Você não disse na sua pergunta, mas se precisar que isso seja recursivo e desça em subdiretórios, você pode usar isso:
O
shopt -s globstar
permitirá opção globstar da festa que permite**
subdiretórios jogo:fonte
**
recursão em subdiretórios.file
nem sempre especifique a extensão que parece: está transformando um arquivo bashfoo.bourne-again
aqui, por exemplo!O script abaixo pode ser usado para (recursivamente) renomear uma extensão definida incorretamente,,
.jpg
para a correta. Caso encontre um arquivo ilegível, ele será reportado na saída do script.O script usa o
imghdr
módulo, para reconhecer os seguintes tipos:rgb
,gif
,pbm
,pgm
,ppm
,tiff
,rast
,xbm
,jpeg
,bmp
,png
. Mais sobre oimghdr
módulo aqui . A lista pode ser estendida com mais tipos, conforme mencionado no link.Como é, renomeia especificamente os arquivos com a extensão
.jpg
, conforme mencionado na pergunta. Com uma pequena alteração, pode ser adequado renomear qualquer extensão, ou um conjunto específico de extensões, para a extensão correta (ou sem extensão, como aqui ).O script:
Como usar
rename.py
Execute-o pelo comando:
fonte
Nota: Minha abordagem parece ser muito complexa. Eu preferiria terdons responder em seu lugar.
Você pode usar o comando
file
para determinar o tipo de arquivo:Com essas informações, os arquivos podem ser renomeados:
Faça um teste antes de aplicar o comando às suas imagens
Exemplo
fonte
find -exec bash -c "..."
e faça tudo lá dentro ou usewhile read -d '' name type
para dividir o nome e afile
saída do arquivo e, em seguida, analise$type
para obter o tipo de arquivo. Realmente não vale a pena, veja minha resposta sobre como fazê-lo com muito mais facilidade em pura (ish) festança.