¿Cuál es la buena manera de agregar la extensión de archivo ".jpg" a archivos sin extensión con bash?
¿Cuál es la buena manera de agregar la extensión de archivo ".jpg" a archivos sin extensión con bash?
Respuestas:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${f%.jpg}"
es la manipulación de cadenas de shell bash. `$ {string% substring}` Elimina la coincidencia más corta de $ substring de la parte posterior de $ string.
.jpg
incluso a los archivos normales.
Puede usar el cambio de nombre:
rename 's/(.*)/$1.jpg/' *
rename from to file...
Otra forma, sin bucles
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg
Descompostura:
el comando anterior es para ejecución en seco , después debe eliminar el "eco" antes de mv
EDITAR Algunas personas sugieren que aquí se necesita "Ajustar los argumentos de la ruta entre comillas; evita la división de argumentos en las rutas con espacios" .
Por lo general, esta recomendación es cierta, en este caso no lo es. Porque, aquí %
se reemplaza no por la expansión del shell sino por el xargs
interno (directamente), por lo %
que se sustituirá correctamente incluso con espacios en los nombres de archivo.
Demostración simple:
$ mkdir xargstest
$ cd xargstest
# create two files with spaces in names
$ touch 'a b' 'c d'
$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths
#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext
$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...
Simple, vaya al directorio donde están sus archivos y:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;done
para admitir espacios en nombres de archivos.
En mi caso, no conocía el tipo de archivo, así que utilicé el comando mv con la ayuda del comando de archivo para examinar y posiblemente encontrar el tipo de archivo. Es posible que esta solución no sea perfecta para todos los archivos, ya que es posible que el comando de archivo no reconozca el tipo de archivo, pero funcionó muy bien para mí.
for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done
El uso de awk es quitar la segunda palabra de la cadena devuelta del archivo de comando que es en realidad la extensión.
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-run
y -a
no están disponibles en mi versión de rename
. Si esto es específico de alguna arquitectura, debe especificarse.
Puede usar mover varios archivos . Soy un mantenedor de este proyecto. La sintaxis es simple.
mmf files*
Abrirá su $ EDITOR con todos los nombres de archivos, o vim por defecto y puede simplemente resaltar el final de todos los nombres de archivos usando Ctrl + v + G en vim, guardar el archivo, salir y eso, todos sus archivos serán renombrados
Ryan Li
La sintaxis correcta para agregar una extensión de archivo a varios archivos dentro de un directorio que no tiene una extensión de archivo es
find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then mv "$FILE" "$FILE".eml; fi; done;
mv "${file}" "${file}.jpg"
?