Caractores de barbear com nomes de arquivos [fechados]

3

Eu tenho alguns arquivos. Eu gostaria de cortar alguns caracteres de seus nomes de arquivos. Os personagens podem estar na cabeça ou na cauda. Não precisa ser um único comando para raspar todos eles.

Dois exemplos são:

  • De um arquivo 01 - SongTitle.mp3 deseja remover 01 -

  • De outro arquivo, SongTitle - ArtistName.mp3 quer remover - ArtistName

Se possível, eu gostaria que uma "string fosse removida" e um tipo de "string para manter" de implementação e não algo tão específico para esses exemplos. Estou disposto ao comando uma string para combinar e ter "string para excluir".

    
por Ben Stumpf 22.09.2016 / 18:07

1 resposta

3

Caso - eu

Como você deseja renomear um arquivo 01 - This is a song.mp3 to This is a song.mp3 trimming 01 - no início. Isso pode ser feito assim,

$ echo "01 - This is a song.mp3" | sed 's/^[0-9]* - //'
This is a song.mp3

Como funciona:

  • Primeiro, identifique a parte comum (dois números no início do nome do arquivo seguido por um espaço, um hífen e outro espaço) que você deseja substituir de todos os nomes de arquivos aqui.
  • Em seguida, precisamos de um regexp para a parte comum.
  • O caret ^ corresponde à posição anterior ao primeiro caractere em uma string e o conjunto de caracteres [0-9] corresponde a um único dígito entre 0 e 9.
  • O asterisco ^[0-9]* corresponde a um ou mais dígitos entre 0 e 9 no início da string.
  • Portanto, ^[0-9]* - é nosso regexp desejado, que corresponde a um ou mais dígitos entre 0 e 9 no início da string, seguido por um espaço, um hífen e outro espaço.

De man sed

s/regexp/replacement/
          Attempt to match regexp against the pattern space.  If successful, 
replace that  portion  matched  with replacement.

Por exemplo, tente no terminal

$ echo "Good day" | sed 's/day/night/'
Good night
$ echo "Good day" | sed 's/day//' ## replacement is kept blank
Good
  • Vamos olhar para o nosso problema original. Não queremos que a parte correspondida permaneça na expressão e seja substituída por em branco usando sed .

Caso - II

O segundo conjunto de arquivos que você deseja renomear de This is a song - Some Artist.mp3 para This is a song trimming - Some Artist no final. Experimente

$ echo "This is a song - Some Artist.mp3" | sed 's/ -.*/.mp3/'
This is a song.mp3

Como funciona:

  • Primeiro, identifique as strings a serem substituídas. Aqui é a parte da string que começa em um espaço seguido por um hífen e o restante da string. Mas queremos que a extensão .mp3 esteja intacta.
  • Aqui, minha abordagem era combinar a sequência inteira após um espaço seguido por um hífen e substituí-la por .mp3 , de modo que permanecesse na sequência no final da sequência após a substituição.
  • O ponto . corresponde a um único caractere, sem importar qual é esse caractere. A única exceção são os caracteres de quebra de linha.
  • -.* corresponde a um ou mais caracteres após um espaço e hífen. Observe que ele também corresponderá a .mp3 .
  • Por isso, usando sed , substituí a parte correspondente por .mp3

você pode aprender mais sobre o regexp no regular-expressions.info

Um regexp melhor para o caso II

Esta parte eu tirei de steeldriver

echo "This is a song - Some Artist.mp3" | sed 's/ -[^.]*//'
This is a song.mp3

Como funciona:

  • Aqui, a abordagem é corresponder à parte da string depois de um espaço seguido por um hífen antes do ponto . de .mp3 e para substituir a parte correspondente por em branco.
  • [^.] corresponde a qualquer caractere, mas não a um ponto .
  • Finalmente, o regexp -[^.]* corresponde a um espaço seguido por um hífen um ou mais caracteres, mas não um ponto . ou outra palavra antes de encontrar um ponto . , que é o nosso regexp desejado.

Renomeação de arquivos

Renomeie os arquivos usando sed e for loop no bash shell

Para renomear arquivos conforme descrito no caso I, você pode usar:

for i in *.mp3; do mv "$i" "$(echo $i | sed 's/^[0-9]* - //')" ; done

Para renomear arquivos conforme descrito no caso II, você pode usar:

for i in *.mp3; do mv "$i" "$(echo $i | sed 's/ -.*/.mp3/')" ; done

Uma alternativa melhor para evitar loop + sed usando rename

rename -v 's/^[0-9]* - //' *.mp3  # For the first set
rename -v 's/ -.*/.mp3/' *.mp3   # For the second set
    
por souravc 22.09.2016 / 20:43