Substitui o caminho do arquivo em todos os m3u's no diretório

1

Criei muitas listas de reprodução "caminho do arquivo relativo" (para que funcionem também no meu telefone) na minha pasta do Soundtrack, mas também em outros lugares e agora decidi renomear minha subpasta clássica de "européia" para " Western ".

Como posso ter certeza de que cada um dos caminhos de arquivo foi alterado de ../../Classical/European/[...] para ../../Classical/Western/[...] ?

Eu costumo editar manualmente esses arquivos no Gedit.

Todas as listas de reprodução e arquivos de música estão em alguma subpasta de /home/gratis/Music

    
por Markus Gratis 05.05.2017 / 07:44

2 respostas

2

Esta é basicamente a mesma abordagem que sugerida pelo Markus, apenas uma sintaxe ligeiramente diferente:

shopt -s globstar
perl -pe 's|((\.\./){2}Classical)/European/|/Western/|' ~/Music/**/*m3u

Explicação

  • shopt -s globstar : este comando ativa a opção globstar do bash, que torna ** igual a todos os arquivos e zero ou mais diretórios e subdiretórios. Portanto, ~/Music/**/*m3u corresponderá a todos os arquivos (e diretórios) em ~/Music ou seus subdiretórios cujo nome terminará em m3u .

  • perl -pe : p digite cada linha de entrada depois de aplicar o script fornecido por -e a ela.

  • s|((\.\./){2}Classical)/European/|/Western/| : este é o operador de substituição. Seu formato geral é s|foo|bar| , que substituirá foo por bar . A forma mais comum é s/foo/bar/ , mas os delimitadores podem ser qualquer caractere. Como aqui queremos combinar algo que contenha / , usei | como delimitador para maior clareza.
  • (\.\./){2} : corresponde a ../ exatamente duas vezes. Como . significa "qualquer caractere" em expressões regulares, eles precisam ser escapados ( \. ). Os parênteses aqui são usados para agrupar o \.\./ para que o {2} se aplique ao grupo.

  • ((\.\./){2}Classical) : os parênteses aqui são usados novamente para formar um grupo, mas desta vez é para nos referirmos ao grupo como no lado direito da substituição. É por isso que substituímos por /Western , porque é o que foi correspondido por (\.\./){2}Classical .

Se isso acontecer, execute-o novamente com a opção -i para editá-lo:

perl -i.bak -pe 's|((\.\./){2}Classical)/European/|/Western/|' ~/Music/**/*m3u

O -i.bak fará com que ele edite o arquivo e crie um backup do original com o mesmo nome e a extensão .bak .

    
por terdon 05.05.2017 / 11:37
2

Você pode substituir todas as ocorrências desta string em todos os arquivos usando este one-liner:

perl -i -pe 's/\.\.\/\.\.\/Classical\/European\//..\/..\/Classical\/Western\//g' /home/gratis/Music/*/*.m3u

Tenha cuidado, pois esse comando substituirá todas as ocorrências de ../../Classical/European/[...] a ../../Classical/Western/[...] em todos os arquivos .m3u em todas as subpastas de /home/gratis/Music/ , mas não /home/gratis/Music/ em si.

Se você quiser apenas verificar a saída, remova o -i do comando. Desta forma, o comando não altera os arquivos.

    
por Markus Ankenbrand 05.05.2017 / 10:56