Renomeia vários arquivos, exclui o padrão

1

Eu quero renomear vários arquivos usando a linha de comando, removendo um padrão do nome do arquivo e mantendo o resto.

Saída original:

$ ls
Versailles - Holy Grail (2011)
Versailles - Jubilee (2010)
Versailles - Noble (2008)

Saída desejada após o comando:

$ ls
Holy Grail (2011)
Jubilee (2010)
Noble (2008)
    
por krystah 10.01.2014 / 10:35

1 resposta

2

Bash

Com Bash puro, removendo tudo até o primeiro - :

for f in *; do mv -- "$f" "${f#*- }"; done

Se você quiser remover tudo até o último - , use ## em vez de # .

Para dividir:

  • O for reúne todos os arquivos no diretório atual ( * ) e chama mv em cada arquivo encontrado.
  • O -- informa mv para parar as opções de análise e é uma proteção para impedir que arquivos iniciados com - sejam interpretados como opções (por exemplo, um arquivo chamado -i faria com que mv avisasse antes de mover ).
  • A ${f#*- } é a manipulação de string e remove a parte que você não quer cada nome de arquivo.
  • Todas as variáveis são citadas para impedir que nomes de arquivos com espaços ou caracteres globbing interrompam o comando. Sempre cite duas vezes suas variáveis.

rename

Com rename que é comumente encontrado nas distribuições do Linux, por exemplo, se você quiser especificar o artista:

rename 's/Versailles - //' *

Ou se você quiser remover tudo até o último - :

rename 's/.*- //' *

Zsh

Em Zsh e zmv , que você precisa carregar com autoload -U zmv :

zmv 'Versailles - (*)' '$1'
    
por 10.01.2014 / 10:52