Como remover o sublinhado entre dois números em todos os arquivos de um diretório

Como remover o sublinhado entre dois números em todos os arquivos de um diretório

Então eu tenho um diretório com pastas aninhadas e em algum momento há .pngimagens.

A nomenclatura dessas imagens é assim "letters_numbers_numbers_letters.png", e quero deletar o sublinhado entre os números.

Digamos que temos um arquivo chamado a_1_2_b.png, quero renomeá-lo para a_12_b.png. Eu sei que tenho que usar algo como:

find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`

mas não sei como especificar como excluir esse sublinhado específico. Lembre-se de que há dois outros sublinhados que não quero tocar.

Desde já, obrigado!

Responder1

Use uma das variantes de perl's rename. Por exemplo, comAquele( renamepacote em sistemas do tipo Debian):

LC_ALL=C find . -name '*[0-9]_[0-9]*' -type f -exec rename -n -d '
  s/(?<=\d)_(?=\d)//g' {} +

(remova o -n(ensaio) quando estiver satisfeito).

Com zshvocê poderia fazer:

autoload -Uz # best in ~/.zshrc
zmv -n  '(**/)(*[0-9]_[0-9]*)(#qD.)' \
        '$1${2//(#m)[0-9][_0-9]#[0-9]/${MATCH//_}}'

É um pouco mais complicado, pois não há equivalente aos operadores regexp do perl em zsh globs.

Eles removem todos os _s cercados por dígitos no nome de cada arquivo normal (renomearia o dir_1_2_3/file_1_2_foo_22_3_4_bararquivo para, dir_1_2_3/file_12_foo_2234_barpor exemplo).

Para remover apenas o segundo _em arquivos regulares que seguem o letters_digits_digits_letters.pngpadrão, seria apenas:

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

informação relacionada