Cambiar el nombre de varios archivos usando sed

Cambiar el nombre de varios archivos usando sed

Tengo el siguiente conjunto de archivos.

top_axi_256_wrapper_05.02.01.14.00_sample06.tgz
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz

Quiero reemplazar 05.02.01.14.00la pieza con 05_02_01_14_00. Entonces el resultado final son los siguientes archivos renombrados

top_axi_256_wrapper_05_02_01_14_00_sample06.tgz
top_axi_128_wrapper_05_02_01_14_00_sample06.tgz

Mi directorio también puede contener los siguientes tipos de nombres de archivos.

a72_a_0.0.0_0.00.04_ac_dc.tgz

Aquí, deseo cambiar el nombre del archivo a

a53_1c_256K_a_0_0_0_0_00_04_ac_dc.tgz

¿Como hacer esto?

Respuesta1

Básicamente, desea reemplazar un punto por un guión bajo, excepto el último.

Puedes usar la expansión de parámetros de bash para eso:

for file in * ; do
    replace_all=${file//./_}
    newname=${replace_all%_*}.${replace_all##*_}
    mv "$file" "$newname"
done
  • //./_medioreemplazar todos los puntos por guiones bajos
  • %_*medioeliminar todo después del último guión bajo
  • ##*_medioeliminar todo hasta el último guión bajo

O puede guardar primero la extensión, luego eliminarla, reemplazar todos los puntos por guiones bajos y volver a agregar la extensión. Se deja como ejercicio para el lector.

Respuesta2

La utilidad perlbasada en - puede usar cualquier instrucción para cambiar el nombre de los archivos, no solo el operador de búsqueda y reemplazo o el operador de traducción (solo asegúrese de configurar el nombre al que desea cambiar el archivo).renameperls///y//$_

De man rename:

"rename" cambia el nombre de los archivos proporcionados de acuerdo con la regla especificada como primer argumento. El argumento perlexpr es una expresión Perl que se espera que modifique la $_cadena en Perl para al menos algunos de los nombres de archivo especificados. Si la expresión no modifica un nombre de archivo determinado, no se le cambiará el nombre. Si no se proporcionan nombres de archivos en la línea de comando, los nombres de archivos se leerán mediante la entrada estándar.

Por ejemplo:

rename 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' files

Esto divide los nombres de archivos en nombre base ($b) y extensión ($e). Luego, $b .reemplaza todos los puntos ( ) con guiones bajos. Finalmente, $_se establece en "$b.$e".

Salida (con la -vopción detallada):

$ touch top_axi_256_wrapper_05.02.01.14.00_sample06.tgz \
    top_axi_128_wrapper_05.02.01.14.00_sample06.tgz \
    a72_a_0.0.0_0.00.04_ac_dc.tgz

$ rename -v 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' *
a72_a_0.0.0_0.00.04_ac_dc.tgz renamed as a72_a_0_0_0_0_00_04_ac_dc.tgz
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_128_wrapper_05_02_01_14_00_sample06.tgz
top_axi_256_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_256_wrapper_05_02_01_14_00_sample06.tgz

Por cierto, utilícelo -nmientras prueba sus renamedeclaraciones. Mas de man rename:

-n, -nono

Ninguna acción: imprima los nombres de los archivos a los que se les va a cambiar el nombre, pero no los cambie.

perl renameestá disponible empaquetado para la mayoría de las distribuciones (por ejemplo, el renamepaquete en Debian), o desdehttps://metacpan.org/release/File-Rename

información relacionada