
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.00
la 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 perl
basada 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).rename
perl
s///
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 -v
opció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 -n
mientras prueba sus rename
declaraciones. 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 rename
está disponible empaquetado para la mayoría de las distribuciones (por ejemplo, el rename
paquete en Debian), o desdehttps://metacpan.org/release/File-Rename