Adicione 0 no meio de um nome de arquivo

3
$ ls
pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3
pro2e_u01_txt_vocabulaire_1_campus.mp3
pro2e_u01_txt_vocabulaire_2_personnes.mp3
pro2e_u01_txt_vocabulaire_3_presentations.mp3
pro2e_u01_txt_vocabulaire_4_identifier.mp3
pro2e_u01_txt_vocabulaire_5_bonjouraurevoir.mp3
pro2e_u01_txt_vocabulaire_6_commentcava.mp3
pro2e_u01_txt_vocabulaire_7_expressionspolitesse.mp3

Eu gostaria de adicionar '0' antes dos números no meio para que eles sejam classificados como

$ ls -v
pro2e_u01_txt_vocabulaire_1_campus.mp3
pro2e_u01_txt_vocabulaire_2_personnes.mp3
pro2e_u01_txt_vocabulaire_3_presentations.mp3
pro2e_u01_txt_vocabulaire_4_identifier.mp3
pro2e_u01_txt_vocabulaire_5_bonjouraurevoir.mp3
pro2e_u01_txt_vocabulaire_6_commentcava.mp3
pro2e_u01_txt_vocabulaire_7_expressionspolitesse.mp3
pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3

O que eu tenho até agora é

$ for i in *.mp3; do echo ${i/_[0-9]_/_0¿_}; done
pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3
pro2e_u01_txt_vocabulaire_0¿_campus.mp3
pro2e_u01_txt_vocabulaire_0¿_personnes.mp3
pro2e_u01_txt_vocabulaire_0¿_presentations.mp3
pro2e_u01_txt_vocabulaire_0¿_identifier.mp3
pro2e_u01_txt_vocabulaire_0¿_bonjouraurevoir.mp3
pro2e_u01_txt_vocabulaire_0¿_commentcava.mp3
pro2e_u01_txt_vocabulaire_0¿_expressionspolitesse.mp3

Eu não sei o que deve ser colocado no lugar de '¿' para que o número que corresponda [0-9] apareça lá.

    
por user107459 21.03.2015 / 02:06

5 respostas

2

Às vezes, uma solução específica é boa o suficiente; como no caso atual, onde é possível identificar os padrões para o subconjunto de arquivos a considerar (por exemplo, /_[0-9]_/ ) e adicionar um zero à esquerda, dependendo de um prefixo de identificação exclusiva (por exemplo, /re_/ ). Coloque tudo junto que seria:

for f in *_[0-9]_*.mp3 ; do mv -i "${f}" "${f/re_/re_0}" ; done

Para a pré-verificação solicitada, você pode adicionar um echo na frente do mv .

    
por 21.03.2015 / 03:14
2

Você pode fazer isso com rename de util-linux também:

rename vocabulaire_ vocabulaire_0 *vocabulaire_[0-9]_*.mp3

resultado:

pro2e_u01_txt_vocabulaire_01_campus.mp3
pro2e_u01_txt_vocabulaire_02_personnes.mp3
pro2e_u01_txt_vocabulaire_12_nationality.mp3
pro2e_u01_txt_vocabulaire_231_whatever.mp3

se você quiser mais nada, repita o comando aumentando o número de dígitos:

rename vocabulaire_ vocabulaire_0 *vocabulaire_[0-9][0-9]_*.mp3

resultado:

pro2e_u01_txt_vocabulaire_001_campus.mp3
pro2e_u01_txt_vocabulaire_002_personnes.mp3
pro2e_u01_txt_vocabulaire_012_nationality.mp3
pro2e_u01_txt_vocabulaire_231_whatever.mp3
    
por 21.03.2015 / 19:53
1
for f in ./*.mp3
do    set "${f%_*}" "_${f##*_}"; f=10${1##*_}
      mv "$1$2" "${1%_*}_${f#*$((${#f}<4))}$2"
done

Isso deve funcionar, eu acho, contanto que seu campo numérico esteja entre o último e o segundo% a último% dividido campo_ e dado que você queira apenas preencher dois dígitos.

    
por 21.03.2015 / 05:00
1

No Debian, Ubuntu e outros sistemas em que rename é um script Perl (em oposição ao do util-linux), este comando será suficiente desde que os arquivos sejam de 1 a 99.

rename 's/_vocabulaire_([0-9]{1})_/_vocabulaire_0$1_/' *.mp3

Se você quiser apenas executar uma execução a seco sem renomear os arquivos, passe na opção -n. Ele mostrará o que realmente será renomeado

rename -n 's/_vocabulaire_([0-9]{1})_/_vocabulaire_0$1_/' *.mp3
    
por 21.03.2015 / 02:19
1

Para os seguintes arquivos:

test0.txt
test1.txt
test2.txt
...
test1234.txt

Isso funcionou para mim:

rename 's/test([0-9]{1}).txt/test0$1.txt/' *
rename 's/test([0-9]{2}).txt/test0$1.txt/' *
rename 's/test([0-9]{3}).txt/test0$1.txt/' *

Resultado:

test0000.txt
test0001.txt
test0002.txt
...
test1234.txt

Claro que você pode envolvê-lo em um loop.

Importante: se os arquivos começarem ou terminarem com números que você deseja preencher, use ^ e $ para corresponder ao início e ao fim, por exemplo:

rename 's/^([0-9]{1}).txt/0$1.txt/' *

ou

rename 's/test([0-9]{1})$/test0$1/' *

Você pode usar o parâmetro rename de -n para visualizar as alterações sem renomear, por exemplo:

rename -n 's/test([0-9]{1}).txt/test0$1.txt/' *
    
por 22.04.2017 / 18:44