varios usarse siguientes renombrar puede para nombre masivo los cuál copiar consola comandos comando carpeta cambiar archivos archivo bash rename file-rename

bash - usarse - renombrar carpeta linux



¿Cómo cambio el nombre de la extensión para un lote de archivos? (18)

Aquí hay un ejemplo del comando de cambio de nombre:

rename -n ’s//.htm$//.html/’ *.htm

La -n significa que es una ejecución de prueba y no cambiará ningún archivo. Le mostrará una lista de archivos a los que se le cambiará el nombre si elimina la -n. En el caso anterior, convertirá todos los archivos en el directorio actual de una extensión de archivo .htm a .html.

Si el resultado de la ejecución de prueba anterior se veía bien, entonces podría ejecutar la versión final:

rename -v ’s//.htm$//.html/’ *.htm

La opción -v es opcional, pero es una buena idea incluirla porque es el único registro que tendrá de los cambios realizados por el comando de cambio de nombre como se muestra en la salida de muestra a continuación:

$ rename -v ''s//.htm$//.html/'' *.htm 3.htm renamed as 3.html 4.htm renamed as 4.html 5.htm renamed as 5.html

La parte difícil en el medio es una sustitución de Perl con expresiones regulares, resaltada a continuación:

rename -v ’s//.htm$//.html/’ *.htm

En un directorio, tengo un montón de archivos *.html .

Me gustaría cambiarles el nombre a *.txt

Yo uso el shell bash.


Después del rastreo del sitio web de otra persona, terminé con miles de archivos que faltan en la extensión .html, en un amplio árbol de subdirectorios.

Para cambiarles el nombre a todos de una sola vez, excepto los archivos que ya tienen una extensión .html (la mayoría de ellos no tenían ninguno), esto funcionó para mí:

cd wwwroot find . -xtype f /! -iname *.html -exec mv -iv "{}" "{}.html" /; # batch rename files to append .html suffix IF MISSING

En el caso del OP, podría modificar eso ligeramente, para solo cambiar el nombre de los archivos * .txt, así:

find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} /;

Descompuesto (hammertime!):

-iname * .txt
- Significa considerar SOLAMENTE los archivos que ya terminan en .txt

mv -iv "{}. {txt, html}": cuando find pasa un {} como nombre de archivo, $ {filename%. *} extrae su nombre base sin ninguna extensión para formar los parámetros de mv . bash toma el {txt, html} para reescribirlo como dos parámetros para que el comando final se ejecute como: mv -iv "filename.txt" "filename.html"

Arreglo necesario sin embargo: tratar con espacios en nombres de archivos


El comando mmv parece hacer esta tarea de manera muy eficiente en una gran cantidad de archivos (decenas de miles en un segundo). Por ejemplo, para cambiar el nombre de todos los archivos .xml archivos .html , use esto:

mmv ";*.xml" "#1#2.html"

el ; coincidirá con la ruta, el * coincidirá con el nombre de archivo, y estos se conocen como #1 y #2 en el nombre de reemplazo.

Las respuestas basadas en exec o tuberías fueron demasiado lentas o fallaron en una gran cantidad de archivos.


En una Mac ...

  1. Instala rename si no lo has hecho: brew install rename
  2. rename -S .html .txt *.html

Esta es la solución más ingeniosa que he encontrado que funciona en OSX y Linux, ¡y funciona muy bien con git también!

find . -name "*.js" -exec bash -c ''mv "$1" "${1%.js}".tsx'' - ''{}'' /;

y con git:

find . -name "*.js" -exec bash -c ''git mv "$1" "${1%.js}".tsx'' - ''{}'' /;


Esta es una buena manera de modificar múltiples extensiones a la vez:

for fname in *.{mp4,avi} do mv -v "$fname" "${fname%.???}.mkv" done

Nota: tenga cuidado con el tamaño de la extensión para que sea el mismo (el ???)


Esta pregunta menciona explícitamente a Bash, pero si tienes ZSH disponible, es bastante simple:

zmv ''(*).*'' ''$1.txt''

Si obtiene zsh: command not found: zmv , simplemente ejecute:

autoload -U zmv

Y luego intente de nuevo.

Gracias a este artículo original por el consejo sobre zmv.


Esto me funcionó en OSX desde .txt hasta .txt_bak

find . -name ''*.txt'' -exec sh -c ''mv "$0" "${0%.txt}.txt_bak"'' {} /;


Lamentablemente no es trivial hacerlo de manera portátil. Probablemente necesites un poco de magia expr.

for file in *.html; do echo mv -- "$file" "$(expr "$file" : ''/(.*/)/.html'').txt"; done

Elimina el eco una vez que estés feliz, hace lo que quieres.

Edición: el basename es probablemente un poco más legible para este caso en particular, aunque expr es más flexible en general.


Para los usuarios de Ubuntu:

rename ''s//.html$//.txt/'' *.html


Para una mejor solución (con solo la funcionalidad de bash, a diferencia de las llamadas externas), vea una de las otras respuestas .

Lo siguiente haría y no requiere que el sistema tenga el programa de rename (aunque lo más frecuente es que tenga esto en un sistema):

for file in *.html; do mv "$file" "$(basename "$file" .html).txt" done

EDITAR: Como se señaló en los comentarios, esto no funciona para los nombres de archivos con espacios en ellos sin una cita adecuada (ahora agregado anteriormente). Cuando trabaje exclusivamente en sus propios archivos, sabe que no tienen espacios en los nombres de archivo, esto funcionará, pero cada vez que escriba algo que pueda reutilizarse más adelante, no omita las citas correctas.


Prueba esto

rename .html .txt *.html

uso:

rename [find] [replace_with] [criteria]


Quieres usar rename :

rename -S .html .txt *.html

Esto hace exactamente lo que desea: cambiará la extensión de .html a .txt para todos los archivos que coincidan con *.html .

Nota: Greg Hewgill señala correctamente que esto no es un basin builtin; y es un comando separado de Linux. Si solo necesitas algo en Linux esto debería funcionar bien; Si necesita algo más multiplataforma, eche un vistazo a una de las otras respuestas.


Si prefieres PERL, hay un script corto de PERL (escrito originalmente por Larry Wall, el creador de PERL) que hará exactamente lo que quieres aquí: tips.webdesign10.com/files/rename.pl.txt . Para tu ejemplo lo siguiente debería hacer el truco.

rename.pl ''s/html/txt/'' *.html

=)

(Gracias @loretoparisi por la URL actualizada)


Si usa bash, no necesita comandos externos como sed, basename, rename, expr, etc.

for file in *.html do mv "$file" "${file%.html}.txt" done


Un poco tarde para la fiesta. Podrías hacerlo con xargs:

ls *.html | xargs -I {} sh -c ''mv $1 `basename $1 .html`.txt'' - {}

O si todos tus archivos están en alguna carpeta.

ls folder/*.html | xargs -I {} sh -c ''mv $1 folder/`basename $1 .html`.txt'' - {}


.edge es lo que solía cambiar el .edge archivos .blade.php a .blade.php

for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done

Funciona como el encanto.


rename ''s//.html$//.txt/'' *.html

hace exactamente lo que quieres.