2011-05-24 23 views
69

¿Cuál es la buena manera de agregar la extensión de archivo ".jpg" a los archivos sin extensión con bash?Agregar extensión de archivo a archivos con bash

+1

'mv" $ {file} "" $ {file} .jpg "'? –

+1

en su vista, ¿qué es un "archivo sin extensión"? ¿Es un archivo sin un punto en el nombre? –

Respuesta

81
for f in *.jpg; do mv "$f" "${f%.jpg}"; done 
for f in *; do mv "$f" "$f.jpg"; done 
+7

¡el segundo es perfecto para renombrar archivos sin extensión! ¡Gracias! – anon58192932

+1

segundo agrega una extensión en todos los archivos, no solo en los sin extensión – Jeff

+5

al igual que una nota '" $ {f% .jpg} "' es la manipulación de la cadena bash shell. ' $ {string% substring}' Elimina la coincidencia más corta de $ substring desde la parte posterior de $ string. – Jichao

4
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done; 
38

Se puede utilizar de cambio de nombre:

rename 's/(.*)/$1.jpg/' * 
+1

¿Qué versión de cambio de nombre estás usando? El mío tiene diferentes argumentos: 'rename from to file ...' –

+1

se incluye el rename con perl, que es la versión 5.10.1. –

+2

Esto funciona muy bien con el cambio de nombre incluido en Ubuntu (y entonces estoy adivinando todas las distribuciones basadas en Debian), mucho menos detallado que la respuesta de jm666. – technicalbloke

21

Otra forma - sin bucles

find . -type f -not -name "*.*" -print0 |\ 
xargs -0 file |\ 
grep 'JPEG image data' |\ 
sed 's/:.*//' |\ 
xargs -I % echo mv % %.jpg 

Desglose:

  • encontrar todos los archivos sin ext ensión
  • comprobar el tipo de archivo
  • filtro a cabo sólo los archivos JPG
  • borrar información de tipo de archivo
  • xargs corren el "mv" para cada archivo

el comando anterior es para simulacro, después de esto, debe eliminar el "eco" antes de mv

+0

Puede poner esto en un bucle y este xargs es superfluo. Me gusta más la respuesta de Ryan en esta situación. – Lucius

+0

'rocas xargs'! :) –

+1

@Lucius - por cierto, la pregunta quiere archivos "sin extensión" - por lo que Ryan debería encontrar solo esos ... – jm666

-2

Ryan Li

La sintaxis correcta para añadir una extensión de archivo de varios archivos dentro de un directorio que no tienen 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; 
7

simple, cd al directorio donde los archivos son y:

for f in *;do mv $f $f.jpg;done 
+0

Por alguna razón, esto funciona para mí, pero la solución de Seth con comillas no. (OSX Mountain Lion bash) – delrocco

+1

Sería mejor si se usa 'for f in *; do mv" $ f "" $ f ".jpg; done' para admitir espacios en nombres de archivo. – Hritik

-1
rename --dry-run * -a ".jpg" # test 
* -a ".jpg" # rename 
+0

'--dry-run' y' -a' no están disponibles en mi versión de 'rename'. Si esto es específico de alguna arquitectura, debe especificarse. –

5

marcha en seco:

rename -n s/$/.jpg/ * 

cambio de nombre real:

rename s/$/.jpg/ * 
Cuestiones relacionadas