image - jpg - open.png in linux
Cambie el nombre de un grupo de imágenes PNG con extensión ".jpg" a ".png" (5)
Así que tengo una carpeta con miles de archivos de imagen, todos ellos guardados como .jpg
.
El problema es que algunos de esos archivos son en realidad archivos de imagen PNG, por lo que no se abren en muchos programas, a menos que cambie manualmente su extensión a .png
. Por ejemplo, el visor de imágenes de Ubuntu arroja este error:
"Error al interpretar el archivo de imagen JPEG (no es un archivo JPEG: comienza con 0x89 0x50)"
Ya ejecuté un hexdump de algunos de estos archivos para confirmar este error y se comprueba.
Estoy buscando una manera simple de encontrar todos los archivos con la extensión incorrecta entre los otros archivos y cambiar su extensión. ¿Cómo podría hacer esto con un script bash, por ejemplo? Hasta ahora no tengo idea. ¡Toda ayuda apreciada!
Desea usar el file
y analizar el resultado. Puede verificar si es un archivo JPEG o PNG al verificar la parte inicial de la salida:
F="filename.jpg"
TYPE=$(file -b $F)
[[ $TYPE == JPEG/ image/ data* ]] && echo "jpg"
[[ $TYPE == PNG/ image/ data* ]] && echo "png"
Puede cambiar la extensión pelando el .jpg
con el basename
. Por ejemplo, lo siguiente cambiará la extensión del archivo $F
con extensión .jpg
a .png
:
mv $F $(dirname $F)/$(basename $F .jpg).png
No estoy seguro de los comandos adecuados para un script bash, pero podría escribir fácilmente un archivo C ++ para tratar de abrir estos archivos y detectar el error. Los archivos que detecta el error no serán del tipo apropiado (suponiendo que ese sea su único problema). Si sabe que esos tipos de archivos incorrectos deben ser PNG, puede cambiar el nombre del archivo. Algo así como el pseudocódigo:
For (ALL_FILES)
{
try
{
open(FILENAME);
}
catch
{
rename(FILENAME, NEW_FILENAME);
}
}
Primero, obtenga una lista de archivos y hágalos en un archivo. Luego, procese la lista en un bucle para que pueda cambiar los archivos uno por uno automáticamente.
#!/bin/bash
FILE=/tmp/list ## Assuming the list of files are in this file.
for file in $(cat $FILE); do
OLD_FILE=$file
NEW_FILE=$(echo $file|sed -e ''s/jpg$/png/'')
mv $OLD_FILE $NEW_FILE
done
Use el file (1)
para determinar el tipo de todos los archivos. Use grep (1)
para filtrar esta lista, eliminando todos los archivos JPEG apropiados. Lo que queda es una lista de archivos que no pueden reconocerse como JPEG.
En una sola línea
file *.jpg | grep -v "JPEG image data"
- asegúrese de verificar que los JPEG image data
realmente son los file
regresan en un archivo JPG correctamente identificado.
Puede usar sed (1)
para eliminar las cosas después de los dos puntos :
y terminar con el nombre del archivo solamente:
file *.jpg | grep -v "JPEG image data" | sed ''s/:.*//''
.. que es el final de mi bash-fu. En este punto, almacenaría la lista resultante en un archivo (agregar > list
) y usaría GREP en un editor de texto para reescribir todas las líneas en un comando de redenominación adecuado, y luego ejecutar eso.
for f in *.jpg ; do
if [[ $(file -b --mime-type "$f") = image/png ]] ; then
mv "$f" "${f/%.jpg/.png}"
fi
done
Esto obtiene una lista de archivos .jpg
, luego cada uno llama a la utilidad de file
para obtener el tipo de mimo. Si eso es image/png
, cambia el nombre del archivo usando una sustitución de manipulación de cadenas .