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á emm3u
. -
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
porbar
. 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 comono 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
.