LINUX.ORG.RU

Сценарий bash - где-то я чего-то не понимаю...


0

0

Есть строка:

find /home/User/Music -name "*.wav" | while read a; do lame -m j -q 0 -b 256 --cbr "$a" <(sed 's/.wav/.mp3/' "$a"); done

Чего хочу, думаю, понятно. Ж;-) Однако в таком виде работает примерно так:

Encoding /home/User/Music/Some Album/01 Some Song.wav
to /proc/self/fd/63

что не совсем то, что хотелось бы...

Если переформатировать в вид без кавычек вокруг строковой переменной, передаваемой sed:

find /home/User/Music -name "*.wav" | while read a; do lame -m j -q 0 -b 256 --cbr "$a" <(sed 's/.wav/.mp3/' $a); done

То "работает" немного по-другому:

sed: can't read /home/User/Music/Some: No such file or directory
sed: can't read Album/01: No such file or directory
sed: can't read Some: No such file or directory
sed: can't read Song.wav: No such file or directory
Can't init outfile '/proc/self/fd/63'
...
Encoding /home/User/Music/Some Album/01 Some Song.wav
to /proc/self/fd/63

Вопрос: как передать в таком варианте для sed именно всю строку, полученную из find? Где я что неправильно понимаю про переменные, перенаправления вывода и т.п.?

★★

первое что пришло в голову: 

$ find . -name "*.wav"  | while read a; do echo "$a" `cat <(echo $a | sed 's/.wav/.mp3/')`; done
./file 1.wav ./file 1.mp3
./file 2.wav ./file 2.mp3
./file 3.wav ./file 3.mp3

dGhost ★★★
()
Ответ на: комментарий от dGhost

Сделал в конечном итоге так:

find /home/User/Music -name "*.wav" | while read a; do echo "$a" > /tmp/lametmp; sed -i 's/.wav/.mp3/' /tmp/lametmp; lame -m j -q 0 -b 256 --cbr "$a" "$(cat /tmp/lametmp)"; rm tempfile; rm "$a"; done

Но так хотелось обойтись без временного файла... Видимо, не хватает пока моего соображения на вдумчивое чтение манов. Ж:-\ Буду дальше ковырять, попробую предложенный вариант - только там, по-моему, тоже для sed надо -i указать?

Cyril ★★
() автор топика
Ответ на: комментарий от Cyril

$ find . -name "*.wav" | while read a; do echo "$a" `cat <(echo $a | sed 's/.wav/.mp3/')`; donе

Да, по этой схеме заработало - спасибо!

Cyril ★★
() автор топика

$ find /home/User/Music -name "*.wav" -exec lame -m j -q 0 -b 256 --cbr "{}" "{}.mp3" \;

$ rename 's/\.wav\.mp3$/.mp3/' *.wav.mp3

sdio ★★★★★
()
Ответ на: комментарий от Cyril

Забыл - с маленькой модификацией:

find /home/User/Music -name "*.wav" | while read a; do lame -m j -q 0 -b 256 --cbr "$a" "$(cat <(echo $a | sed 's/.wav/.mp3/'))"; rm "$a"; done

Cyril ★★
() автор топика
Ответ на: комментарий от Cyril

ну не переименовывай. Или тебя сильно коробит от имен music.wav.mp3 ?

sdio ★★★★★
()

find /home/User/Music -name "*.wav" | while read a; do lame -m j -q 0 -b 256 --cbr "$a" "${a%.wav}.mp3"; done

Если же очень хочется седом, то вовсе не надо никаких cat, echo и пайпов:

find /home/User/Music -name "*.wav" | while read a; do lame -m j -q 0 -b 256 --cbr "$a" "`sed 's/\.wav$/.mp3/' <<< "$a"`"; done

Ссылка для размышлений: http://partmaps.org/era/unix/award.html

Jini ★★
()
Ответ на: комментарий от sdio

sdio: Именно коробит - ну не нравятся они мне.

Jini: Поизучаю... Ж;-)

И всем спасибо. Ж:-)

Cyril ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.