Renomear arquivos com um comando de linha


10

Eu tenho esse diretório e quero renomear os arquivos:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

O resultado deve ficar assim:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Eu gostaria de resolver isso com ferramentas comuns de shell.


1
Eu gostaria de resolver isso com ferramentas comuns de shell. Não estou dizendo que você não tem um bom motivo, mas confio que você tenha feito e respondido a uma pergunta "por quê?". Na última vez que tive um problema muito semelhante a resolver, joguei Bash imediatamente para um lado e o resolvi em Python. Muito mais fácil (mas eu já conhecia Python, métodos de string, glob.glob e os.rename - e também tive que recuar em uma árvore cheia de nomes de pastas com espaços e outros caracteres estranhos, nenhum dos quais causa extra se você estiver usando Python)
nigel222

1
@ nigel222 Sou preguiçoso e quero digitar o mínimo de caracteres possível. É por isso que não quero usar python aqui. Não me interpretem mal. Até agora, Python é minha linguagem de programação preferida e a utiliza diariamente.
guettli

Respostas:


18

Você poderia usar rename...

rename -n 's/^[0-9]+ - //' *

Remova -napós o teste para renomear os arquivos

Explicação

  • s/old/new/substitua oldpornew
  • ^ início da string
  • [0-9]+ alguns números

que tipo de flor regex é suportada pela renameferramenta. Ele usa PCRE? ... seria ótimo.
guettli

5
@ guettli, estritamente falando, não, não é PCRE (que é expressões regulares compatíveis com Perl ). O renameé um script Perl, portanto, ele oferece suporte completo a expressões regulares do Perl; PCRE é apenas um subconjunto disso. No entanto, tudo o que você conhece do PCRE será aplicável rename.
terdon

@terdon Eu não ligo para a implementação. Se você olhar com óculos de matemática, terá renameexpressões regulares compatíveis com perl. Sim, a implementação do pcre não é usada. Eu entendi isso :-) Obrigado por sua resposta rápida.
guettli

9

bash expansão de parâmetro para remover a parte necessária do início:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Forma expandida:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echoé para funcionamento a seco; se livrar dele para ação real:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Exemplo:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

Sim, funciona. Obrigado. Como conheço a expressão regular compatível com perl do Python (que uso diariamente), prefiro o renamecomando (Menos digitação necessária).
guettli

1
@ guettli renameé o caminho a percorrer se você estiver familiarizado com o PCRE; a renameresposta já foi dada, então tem que se mover com puro bash. Apenas para observar, pythono módulo re(ou regex) não é totalmente compatível com PCRE.
heemayl

@ guettli Você também acabou de votar na minha resposta? : O
heemayl

Sim, fiz e votei no seu comentário. Espero que você não leve para o lado pessoal. Não me interpretem mal, mas minha opinião pessoal é que isso ${f#[[:digit:]]*-[[:blank:]]}é feio. Sim, funciona. Mas vivemos no século XXI. Eu acho que é hora de mudar de "funciona" para "é fácil e divertido". Se "funciona" for o objetivo, o Linux nunca perderá o preconceito de não ser amigável. Como você já recebeu muitos votos positivos, esse voto negativo não deve prejudicar (espero). Se isso acontecer, diga-me, e eu vou devolvê-lo.
guettli

1
@ guettli O que mais lhe convier. Aqui: gnu.org/software/bash/manual/html_node/… Apenas para observar, a classe de personagem [[:digit:]]e [[:blank:]]a sua conformidade com a sua locale, também são bastante comuns no Regex.
precisa saber é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.