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
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.
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
.
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
y presumiblemente correría eso desde el directorio de nivel superior? – robjmills
@seengee: sí. Tenga en cuenta que este comando también pierde el guión en '-type'. – Stephan202
esto va a encontrar archivos sin extensión y añadir su .jpg
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
+1 porque esto omite archivos que ya tienen una extensión. – Stephan202
Esto definitivamente proporcionará el resultado deseado el 99% del tiempo. +1 – les
rename
no está seguro de que puede cambiar el nombre de archivos sin extensiones (estoy en windows 7 en este momento)
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
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
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.
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
- 1. Hacer ejecutables todos los archivos PHP (recursivamente)
- 2. Imprimir recursivamente todos los archivos de Vim
- 3. Difiere un directorio recursivamente, Ignorando todos los archivos binarios:
- 4. Buscar recursivamente archivos con una extensión específica
- 5. Uso de PowerShell para agregar una extensión a los archivos
- 6. Agregar extensión de archivo a archivo de extensión-menos
- 7. Agregar recursivamente archivos a un repositorio de Subversion
- 8. Agregar extensión de archivo a archivos con bash
- 9. Agregar todos los archivos no rastreados a la vez
- 10. Cómo agregar la extensión .xml a todos los archivos en una carpeta en Unix/Linux
- 11. Cómo recursivamente enumerar todos los archivos y directorios
- 12. TCL: buscar recursivamente subdirectorios para obtener todos los archivos .tcl
- 13. Subversion: cómo eliminar todos los archivos .svn recursivamente?
- 14. HDFS: ¿Cómo se enumeran los archivos recursivamente?
- 15. Java: ¿cómo obtener todos los subdires recursivamente?
- 16. ¿Encontrar todos los archivos con cierta extensión en Unix?
- 17. gitignore todos los archivos de extensión en el directorio
- 18. Recursivamente incluyendo todos los subdirectorios modelo
- 19. iterar recursivamente sobre todos los archivos en un directorio y sus subdirectorios en Qt
- 20. Búsqueda de archivos recursivamente
- 21. ¿Qué se expande a todos los archivos en el directorio actual recursivamente?
- 22. ¿Agregar todos los archivos a una confirmación excepto un solo archivo?
- 23. ¿Cómo encontrar todos los archivos con cierta extensión en Android?
- 24. git agregar todos excepto ignorar archivos en el archivo .gitignore
- 25. agregar/eliminar TraceListener a todos los TraceSources
- 26. Cómo agregar todos los archivos jar externos a la biblioteca en eclipse exportar a war
- 27. ¿Cómo recursivamente usar JpegTran (línea de comando) para optimizar todos los archivos en subdirectorios?
- 28. ¿enumera recursivamente todos los archivos y carpetas bajo la ruta dada?
- 29. Cómo eliminar archivos recursivamente
- 30. maravilloso (Archivo IO): encontrar todos los archivos y devolver todos los ficheros - la forma maravillosa
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
@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
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