Então eu tenho um diretório com pastas aninhadas e em algum momento há .png
imagens.
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( rename
pacote 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 zsh
você 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_bar
arquivo para, dir_1_2_3/file_12_foo_2234_bar
por exemplo).
Para remover apenas o segundo _
em arquivos regulares que seguem o letters_digits_digits_letters.png
padrão, seria apenas:
zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
'$1$2$3'