Expansão de chaves do Ubuntu shell - confusão com o comando sox

1

Gostaria de pesquisar em vários subdiretórios e converter todos os arquivos .mp3 em arquivos .al. Aqui está como eu faço:

find . -name '*.mp3' -type f -print0 | xargs -0 -t -r -I {} sox {} -r 8000 -c1 -e a-law {}.al lowpass 4000 compand 0.02,0.05 -60,-60,-30,-10,-20,-8,-5,-8,-2,-8 -8 -7 0.05

Mas isso me deixa com os arquivos como filename.mp3.al, então eu faço isso:

rename 's/.mp3.al$/.al/' ./**/*.mp3.al

Parece meio desajeitado, mas não consigo entender como obter essa expansão para remover a antiga extensão .mp3.

(Caso alguém esteja se perguntando, isso é para uso em um sistema PBX Asterisk 13.8.2. Eu sei que ele tem seu próprio conversor embutido, e também pode tocar mp3s, mas nenhuma das soluções é tão boa quanto alaw nativa!)

    
por lardconcepts 05.05.2016 / 15:30

1 resposta

2

AFAIK, nesse contexto, o {} não é realmente "shell curly chaves" (no sentido de expansão de chave por exemplo), eles são apenas espaços reservados textuais para argumentos. Como tal, você poderia passá-los em um comando shell e usar o recurso de substituição de parâmetros do shell para modificar os nomes, como

sh -c 'for f; do somecommand "$f" "${f%.*}.al"; done' sh {}

Para ilustrar com um comando mais simples, dado

$ tree
.
├── dir
│   ├── other file.mp3
│   └── some file.csv
├── other file.txt
└── some file.mp3

1 directory, 4 files

Então

$ find . -name '*.mp3' -print0 | xargs -0 -I {} sh -c 'for f; do printf "%s --> %s\n" "$f" "${f%.*}.al"; done' sh {}
./dir/other file.mp3 --> ./dir/other file.al
./some file.mp3 --> ./some file.al

ou (se o find do seu sistema suportar)

$ find . -name '*.mp3' -exec sh -c 'for f; do printf "%s --> %s\n" "$f" "${f%.*}.al"; done' sh {} +
./dir/other file.mp3 --> ./dir/other file.al
./some file.mp3 --> ./some file.al
    
por 05.05.2016 / 16:09