agregue recursivamente la extensión de archivo a todos los archivos

106

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

Robjmills
fuente

Respuestas:

228

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

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

Explicación: esto busca recursivamente todos los archivos ( -type f) comenzando desde el directorio actual ( .) y aplica el comando mover ( mv) a cada uno de ellos. Tenga en cuenta también las comillas {}, para que los nombres de archivo con espacios (e incluso nuevas líneas ...) se manejen correctamente.

Stephan202
fuente
7
En particular, este funciona mejor si hay una gran cantidad de archivos en la estructura del directorio (lo que hace que bash se moleste por la longitud de la lista de archivos para iterar).
DrAl
@Al, si se refiere a un forbucle que trastorna a bash para iterar sobre una lista de archivos, eso no es correcto. El forbucle bash emite iterativamente cada mvcomando.
nik
Pregunta: ¿ findPrimero configura una lista de archivos antes de ejecutar la -execdeclaración? Supongo que sí, pero quiero aclarar este punto antes de codificar bucles infinitos.
Boldewyn
2
este comando también encontrará archivos con extensión. ¿Es eso lo que quiere OP?
ghostdog74
1
@ ghostdog74: Dado que aceptó esta respuesta, aparentemente lo anterior funcionó. De lo contrario, como mencionaste a continuación, agregar -not -name "*.*"será suficiente.
Stephan202
62

esto encontrará archivos sin extensión y agregará su .jpg

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
ghostdog74
fuente
Esto definitivamente proporcionará el resultado deseado el 99% del tiempo. +1
les
9

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

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

Utilizando la find | xargs patrón 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 de cambio de nombre que se encuentra en las distribuciones con sabor a Debian (también conocido como prename), en lugar del cambio de nombre tradicional. Sin embargo, es solo un pequeño script de Perl, por lo que sería bastante fácil usar el comando anterior en cualquier sistema.

Chad Huneycutt
fuente
4

Me gusta esto,

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

No espero que tenga nombres de archivo separados por espacios.
Si es así, los nombres deberán procesarse un poco.

Si desea ejecutar el comando desde algún otro directorio,
puede reemplazarlo find .por find /target/directory.

nik
fuente
1
A esto le falta un "hacer" y si hay espacios en el nombre del archivo, es mejor citar el nombre del archivo: for f in $ (find. -Type f); do mv "$ f" "$ {f} .jpg"; hecho
DrAl
y presumiblemente lo ejecutaría desde dentro del directorio de nivel superior?
robjmills
@seengee: sí. Tenga en cuenta que este comando también pierde el guión -type.
Stephan202
Tuve que ir a alguna parte y escribí demasiado rápido ... arreglando ahora.
nik
1

Para cambiar el nombre de todos los archivos sin extensión en Windows Basic, puede hacerlo. ren * *.jpg Dado que el archivo no tiene extensión, solo use el *, o si desea cambiar png a jpg, useren *.png *.jpg

Nuno
fuente
0

rename

no estoy seguro de que pueda cambiar el nombre de los archivos sin extensiones (estoy en Windows 7 en este momento)

dfa
fuente
1
puede, pero también cambiará el nombre de los directorios, y no hay forma de decirle que funcione recursivamente en los subdirectorios (al menos con la versión que tengo en Ubuntu).
mirod
Conozco al menos dos comandos diferentes llamados rename, uno un programa C incluido en util-linux-ng y otro un programa Perl (por el propio Wall) en las máquinas Debian de nuestra universidad. En realidad, ninguno de los dos hace recursividad.
Boldewyn