Por que esse comando não funciona? Variantes Regex & Find para arquivos .mp3 .wav e .m4a

0
2015.10.25 Move on and Be Blessed.wav             dummy.m4a
2015.11.17 BS Full.wav.mp3                        
2015.11.17 BS MOL.wav.mp3           

find . -name '*.mp3' -o -name '*.wav' -o -name '*.m4a' -print0

mas este comando funciona find . -name "*.wav" -o -name '*.mp3' -print0

Eu tenho lido Como usar o comando find para procurar por várias extensões e Como converter todos os .wav arquivos em subdiretórios para .aac usando neroAacEnc?

Como é que a minha versão regex não funciona? %código% Eu poderia canalizar este comando regex para o comando subseqüente descrito na segunda postagem referenciada, find . -regex '*\.\(.mp3\|.wav\|.m4a\)' -print0 substituindo o comando find . -name "*.wav" -print0 | while read -d $'find . -name "*.wav" -print0' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done ?

    
por phillipsk 02.01.2016 / 23:15

2 respostas

2

Sua pergunta parece estar perdendo seu início, mas a razão pela qual seu comando find-regex não funciona é que você precisa começar com .* (sintaxe regex para "qualquer coisa") não apenas * (sintaxe glob para "qualquer coisa"). Você também tem um . estranho na frente de suas extensões.

find . -regex '.*\.\(mp3\|wav\|m4a\)' -print0

Quanto ao seu cachimbo, deve funcionar. Teste-o colocando um echo na frente de ffmpeg . Meu instinto seria escrever uma função ou um script que eu pudesse testar em um arquivo, ou então garantir que meus arquivos não tivessem novas linhas neles. Os espaços são uma coisa, os usuários gostam deles, mas as novas linhas são uma dor.

    
por 02.01.2016 / 23:48
0

Seu regex não funciona, porque não é uma regex válida.

* não funciona como o mesmo em um regex. Para obter mais ou menos o mesmo comportamento, você precisa de .* , mas normalmente não precisa de nada, porque um regex é uma correspondência de substring de qualquer maneira.

Você também precisa escapar de qualquer . que você queira que corresponda a um literal - porque de outra forma isso significa qualquer caractere. Como você escapou do primeiro . e não do segundo, você está realmente correspondendo.

.?mp3

Qual não acho que você tenha.

Então:

find -regex '\.(mp3|wav|m4a)$' 

Provavelmente faria o truque.

Não sei por que seu primeiro padrão não funciona, porque eu não estou em um sistema Unix no momento para checar novamente. Mas eu acho que será porque o -print0 está sendo aplicado ao último termo, não a todos. Por acaso, o seu primeiro exemplo - existem arquivos wav sendo impressos?

Porque você pode precisar de colchetes:

find \( -name '*.wav' -o -name '*.mp3' -o -name '*.m4a' \) -print0 
    
por 02.01.2016 / 23:48