it-swarm-es.tech

Cambiar el nombre de un grupo de archivos con un comando

Si tengo un grupo de archivos con una extensión .htm, ¿cómo puedo cambiarles el nombre a .html?

mv *.htm *.html

no funciona.

38
Richard Hoskins

O bien, podría usar puro bash ... (excepto mv, eso es ...)

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

y evita las cosas desagradables del nombre básico. ;)

Bash tiene un amplio conjunto de opciones de expansión variable. El que se usa aquí, '%', elimina el sufijo de coincidencia más pequeño del valor de la variable. El patrón es un patrón global, entonces ${file%.*} también funcionaría. El operador '%%' elimina el sufijo de coincidencia más grande y es intercambiable en el ejemplo anterior, ya que el patrón es fijo, ${file%%.*}.html convertiría a.b.htm en a.html sin embargo.

Vea la sección de subtítulos variables de la página de manual de bash para más trucos interesantes. Hay muchas cosas que se pueden hacer dentro de bash directamente.

50
falstro

rename(1) es una utilidad Perl que hace exactamente lo que quieres. En este caso:

rename 's/\.htm$/.html/' *htm

o si está utilizando subdirectorios también

(requiere Bash 4.0 y la configuración globstar: shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm

11
TRS-80

No debería haber espacios, líneas nuevas u otros espacios en blanco en los nombres de archivo, pero esta versión de la respuesta de freiheit maneja esos. También usa $() en lugar de backticks para facilitar la lectura junto con otros beneficios.

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

Aún mejor: para el caso especial de simplemente agregar al final:

for file in *.htm
do
    mv "$file" "${file}l"
done
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Pruébelo con un echo delante del mv por primera vez.

El problema con su original es que "mv *.htm *.html" tiene el *s manejado por el Shell, por lo que el comando mv simplemente ve una lista de todos los archivos .htm y .html en el directorio actual. En otras palabras, algo así como "mv foo.htm bar.htm stuff.htm six.htm file.htm ". mv solo sabe cómo manejar más de 2 argumentos si el último es un directorio.

6
freiheit

Sin embargo, otro ejemplo de bash puro con reemplazo de cadena.

for file in *.htm; do mv $file ${file/htm/html}; done

Extra: reemplaza todas las apariciones de una cadena

for file in *.htm; do mv $file ${file//htm/html}; done
3
xalupadas

Si usa Zsh puede usar 'zmv'

1
Martin

La mejor herramienta es mmv .

mmv \*.htm #1.html

Otros ejemplos de uso (y de otras herramientas) en " Resumen de herramientas de línea de comandos GNU/Linux ".

1
bortzmeyer

El paquete util-linux-ng (en Fedora) tiene un comando rename similar al mencionado por TRS- 8 . Puedes usarlo así:

rename .htm .html *.html
0
Cristian Ciupitu