2009-07-10 14 views
80

Tengo algunos directorios y subdirectorios que contienen archivos sin extensión de archivo. Deseo agregar .jpg a todos los archivos contenidos en estos directorios. He visto scripts bash para cambiar la extensión del archivo, pero no solo para agregar uno. También necesita ser recursivo, ¿alguien puede ayudar, por favor?agregar recursivamente la extensión de archivo a todos los archivos

Respuesta

176

comando alternativo sin un bucle explícito (man find):

find . -type f -exec mv '{}' '{}'.jpg \; 

Explicación: este se encuentra de forma recursiva todos los archivos (-type f) a partir del directorio actual (.) y aplica el comando de movimiento (mv) a cada uno de ellos. Tenga en cuenta también las cotizaciones alrededor de {}, de modo que los nombres de archivos con espacios (e incluso líneas nuevas ...) se manejen adecuadamente.

+6

En particular, este funciona mejor si hay una gran cantidad de archivos en la estructura del directorio (haciendo que bash se enoje con la longitud de la lista de archivos para iterar). – DrAl

+0

@Al, si se refiere a un 'bash' molesting loop bash para iterar sobre una lista de archivos, eso no es correcto. El bucle bash 'for' iterativamente emite cada comando' mv'. – nik

+0

Pregunta: ¿'find' primero configura una lista de archivos * antes de que * ejecute la instrucción' -exec'? Supongo que sí, pero quiero aclarar este punto antes de codificar infinitos bucles. – Boldewyn

4

como este,

for f in $(find . -type f); do mv $f ${f}.jpg; done 

No espero que tiene separadas por espacios nombres de archivo,
Si lo hace, tendrá que ser procesado un poco los nombres.

Si desea ejecutar el comando desde cualquier otro directorio,
puede reemplazar el find . con find /target/directory.

+1

Esta falta una 'do' y si hay espacios en el nombre de archivo, es mejor citar el nombre de archivo: para f en $ (find. -type f); hacer mv "$ f" "$ {f} .jpg"; hecho – DrAl

+0

y presumiblemente correría eso desde el directorio de nivel superior? – robjmills

+0

@seengee: sí. Tenga en cuenta que este comando también pierde el guión en '-type'. – Stephan202

49

esto va a encontrar archivos sin extensión y añadir su .jpg

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \; 
+6

+1 porque esto omite archivos que ya tienen una extensión. – Stephan202

+0

Esto definitivamente proporcionará el resultado deseado el 99% del tiempo. +1 – les

0

rename

no está seguro de que puede cambiar el nombre de archivos sin extensiones (estoy en windows 7 en este momento)

+1

puede, pero también cambiará el nombre de directorios, y no hay forma de decirle que funcione recursivamente en subdirectorios (al menos con la versión que tengo en Ubuntu). – mirod

+0

Conozco al menos dos comandos diferentes llamados 'rename', uno de C incluido en util-linux-ng y uno de Perl (de Wall) en las máquinas Debian de nuestra universidad. En realidad, ninguno de los dos hace recursividad. – Boldewyn

9

Esto es un poco tarde, pero pensé que agregaría que una mejor solución (aunque quizás menos legible) que las que hasta ahora podría ser:

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/' 

El uso del patrón find | xargs generalmente resulta en una ejecución más eficiente, ya que no tiene que bifurcar un nuevo proceso para cada archivo.

Tenga en cuenta que esto requiere la versión del cambio de nombre que se encuentra en las distribuciones con sabor a Debian (también conocido como pre nombre), en lugar del cambio de nombre tradicional. Sin embargo, es solo una pequeña secuencia de perl, por lo que sería bastante fácil usar el comando anterior en cualquier sistema.

0

Para cambiar el nombre de todos los archivos sin extensión en Windows básica que puede hacer ren * *.jpg Desde el archivo sin extensión, sólo tiene que utilizar el *, o si desea cambiar png a jpg uso ren *.png *.jpg

Cuestiones relacionadas