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....

Ricardo
fuente

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
bash-o-logist
fuente
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
Michał Šrajer
fuente
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
Karoly Horvath
fuente
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 .

sorigal
fuente
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
Fredrik Pihl
fuente
4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
ztank1013
fuente
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:

James Yen
fuente
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.

Easwar
fuente
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
C. Ramseyer
fuente
0

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

Jadeye
fuente
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
Tharindu Sathischandra
fuente