Cómo eliminar el guión bajo entre dos números en todos los archivos de un directorio

Cómo eliminar el guión bajo entre dos números en todos los archivos de un directorio

Entonces tengo un directorio con carpetas anidadas y en algún momento hay .pngimá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( renamepaquete 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_bararchivo, dir_1_2_3/file_12_foo_2234_barpor ejemplo).

Para eliminar solo el segundo _en archivos normales que siguen el letters_digits_digits_letters.pngpatrón, sería simplemente:

zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
       '$1$2$3'

información relacionada