Si tengo un grupo de archivos con una extensión .htm, ¿cómo puedo cambiarles el nombre a .html?
mv *.htm *.html
No funciona.
Si tengo un grupo de archivos con una extensión .htm, ¿cómo puedo cambiarles el nombre a .html?
mv *.htm *.html
No funciona.
Respuestas:
O, puedes usar bash puro ... (excepto para mv, es decir ...)
for file in *.htm; do mv "$file" "${file%.htm}.html"; done
y evitar las cosas desagradables nombre bajo. ;)
Bash tiene un extenso conjunto de opciones de expansión variable. El que se usa aquí, '%', elimina el sufijo más pequeño del valor de la variable. El patrón es un patrón glob, por lo que ${file%.*}
También funcionaría. El operador '%%' elimina el mayor sufijo coincidente, y es intercambiable en el ejemplo anterior, ya que el patrón es fijo, ${file%%.*}.html
sin embargo, convertiría a.b.htm en a.html.
Vea la sección de sustitución de variables de la página de manual de bash para más trucos ingeniosos. Hay mucho que se puede hacer dentro de bash directamente.
No debe haber espacios, nuevas líneas u otros espacios en blanco en los nombres de archivo, pero esta versión de la respuesta de freiheit los maneja. Tambien 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
rename(1)
Es una utilidad de 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 de globstar: shopt -s globstar
)
rename 's/\.htm$/.html/' **/*htm
rename
viene con perl, y básicamente cada unix viene con perl en estos días.
shopt -s globstar
(desactivado por defecto). Además, Linux y Unix tienen directorios en lugar de carpetas.
for file in *.htm; do
mv $file `basename "$file" .htm`.html
done
Pruébalo con un echo
en frente de mv
primera vez
El problema con tu original es que " mv *.htm *.html
" tiene el *
s manejado por la concha, por lo que el mv
el comando simplemente ve una lista de todos los archivos .htm y .html en el directorio actual. En otras palabras, algo 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.
mv
no funcionará
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 de GNU / Linux ".
#
.
los util-linux-ng paquete (en Fedora) tiene una rename
comando similar al mencionado por TRS-80 . Puedes usarlo así:
rename .htm .html *.html
ren *.htm *.html
Funcionará en Windows.