Entonces tengo un directorio con carpetas anidadas y en algún momento hay .png
imágenes.
El nombre de estas imágenes es así "letras_números_números_letras.png", y quiero eliminar el guión bajo entre los números.
Digamos que tenemos un archivo llamado a_1_2_b.png
, quiero cambiarle el nombre a a_12_b.png
. Sé que tengo que usar algo como:
find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`
pero no estoy seguro de cómo especificar cómo eliminar este guión bajo específico. Recuerde que hay otros dos guiones bajos que no quiero tocar.
¡Gracias de antemano!
Respuesta1
Utilice una de las variantes de perl
's rename
. Por ejemplo, conAquél( rename
paquete en sistemas tipo Debian):
LC_ALL=C find . -name '*[0-9]_[0-9]*' -type f -exec rename -n -d '
s/(?<=\d)_(?=\d)//g' {} +
(elimine el -n
(ejecución en seco) cuando esté satisfecho).
Con zsh
, podrías hacer:
autoload -Uz # best in ~/.zshrc
zmv -n '(**/)(*[0-9]_[0-9]*)(#qD.)' \
'$1${2//(#m)[0-9][_0-9]#[0-9]/${MATCH//_}}'
Es un poco más complicado, ya que no existe un equivalente de los operadores de expresiones regulares de perl en zsh globs.
Estos eliminan todos los _
s que están rodeados de dígitos en el nombre de cada archivo normal (cambiaría el nombre del dir_1_2_3/file_1_2_foo_22_3_4_bar
archivo, dir_1_2_3/file_12_foo_2234_bar
por ejemplo).
Para eliminar solo el segundo _
en archivos normales que siguen el letters_digits_digits_letters.png
patrón, sería simplemente:
zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
'$1$2$3'