Cambiar el nombre de todos los archivos en el directorio de $ filename_h a $ filename_half?


139

Muy simple.

¿Cómo cambio el nombre?

05_h.png
06_h.png

a

05_half.png
06_half.png

Al menos, creo que es simple, pero es difícil para Google para este tipo de cosas a menos que ya lo sepas.

Gracias....

Respuestas:


301

Simplemente use bash, no es necesario llamar a comandos externos.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

No añada #!/bin/sh

Para aquellos que necesitan esa frase:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

77
Buen uso del reemplazo de cuerdas incorporado de bash en lugar de sed
— dandrews 05 de

3
¿es file / _h.png / _half.png regex?
— user2799603

15
No, el formato es este: $ {string / substring / substitution} - "sustituto de la primera aparición". Para obtener más información, consulte esta hoja de trucos (sección "cadenas"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
— WindRider

11
¿Alguna razón para Do not add #!/bin/sh? Intenté trabajar con / sin esta declaración.
— Ryan

66
@Ryan @Ishan Jain De hecho, indica el shell del backend que debe ejecutar el script. sh y bash son shells diferentes, por lo que puede afectar el comportamiento y la sintaxis del script. Dado que el script usa un reemplazo de cadena incorporado bash, debe agregar el encabezado #!/bin/bash. Dicho esto, bash es normalmente el shell predeterminado en muchas computadoras, por lo que no encontrará muchas diferencias: D Puede encontrar más información aquí
— Cristian Ramon-Cortes

65

Probar renamecomando:

rename 's/_h.png/_half.png/' *.png

Actualizar:

ejemplo de uso:

crear algo de contenido

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

solución de prueba:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou: agregué una sesión de prueba de ejemplo. Por favor pruebalo. Probablemente tengas algún error tipográfico. ¿Cuál es la salida de ls? ¿Qué es lo rename ...que intentas?
— Michał Šrajer

2
No funciona en bash en Mac, fwiw. renameNo es una herramienta estándar de Unix.
— tandrewnichols

1
@tandrewnichols, prueba homebrew - una vez instalado, el cambio de nombre estará disponible en segundos conbrew install rename
— Simbamangu

44
en cuanto a mí, cambiar el nombre no funcionó 's//'- hice referencia al hombre y había una sinopsis simple:, rename [options] expression replacement file...en CentOS 7, versión:rename from util-linux 2.23.2
— tymik

2
tenga en cuenta que .coincide con CUALQUIER carácter, no solo con un punto: para el punto literal, use \.en su lugar
— Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
Esto es excelente para hacer una carrera en seco de antemano. Primero reemplacé mv $f $fnewcon echo $fnewla segunda línea para asegurarme de que la salida se vea sana.
— lobati

10

¿Estás buscando una solución de bash puro? Hay muchos enfoques, pero aquí hay uno.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Esto supone que los únicos archivos en el directorio actual que terminan en _h.png son los que desea renombrar.

Mucho más específicamente

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Presumiendo que esos dos ejemplos son los únicos. archivos.

Para el caso general, el cambio de nombre de archivo se ha cubierto anteriormente .


6

Use la renameutilidad escrita en perl. Sin embargo, es posible que no esté disponible de forma predeterminada ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png

4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done

4

Tuve una pregunta similar: en el manual, describe cambiar el nombre como

rename [option] expression replacement file

para que puedas usarlo de esta manera

rename _h _half *.png

En el código: '_h' es la expresión que estás buscando. '_half' es el patrón con el que desea reemplazar. '* .png' es el rango de archivos que está buscando para sus posibles archivos de destino.

Espero que esto pueda ayudar c:


1

Otro enfoque puede ser manualmente usando la opción de cambio de nombre de lote

Haga clic derecho en el archivo -> Comandos personalizados de archivo -> Cambiar nombre de lote y puede reemplazar h. con la mitad

Esto funcionará para la interfaz gráfica de usuario basada en Linux usando WinSCP, etc.


0

Usa la renameutilidad:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png

0

Un trazador de líneas:
for file in *.php ; do mv "$file" "_$file" ; done


0

Aunque el conjunto de respuestas está completo, necesito agregar otro que falta.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.