LINUX.ORG.RU

Шелл скрипт, запутался.


0

0

#!/bin/bash
echo -n "Преобразование WAV > MP3
Укажите битрейт: "; read br
find . -name "*.wav" | \
while read w; do
lame -b $br \
--tt `echo "$w" | cut -d\/ -f2 | cut -d . -f1`\
"$w" "${w/%wav/mp3}"
done

Этот скрипт не обрабатывает файлы с пробелами в названиях, пропускает
Убираю строчку
--tt `echo "$w" | cut -d\/ -f2 | cut -d . -f1`\
Всё работает. Я не пойму, какая связь?

Вот ошибка:

lame: excess arg ./Три и Два.wav

Когда эта строка есть, файлы с пробелами вылетают, с такой ошибкой.

Ткните носом, плз.!
Спасибо.

★★★

Не вникая в подробносмти, я бы сразу заменил:
--tt `echo "$w" | cut -d\/ -f2 | cut -d . -f1`
на более предсказуемое:
--tt"`echo \"$w\" | cut -d\/ -f2 | cut -d'.' -f1`"

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

$ w=`find -name "Три и Два.wav"`

$ tt=`echo "$w" | cut -d\/ -f2 | cut -d . -f1`

$ echo $w
./Три и Два.wav

echo $tt
Три и Два

$ lame --tt "$tt" "$w" "${w/%wav/mp3}"

Готово, теперь проигрываю:

$ mpg123 'Три и Два.mp3'

Вижу следующее: Title: Три и Два , то есть оно подсунуло название файла, в тег --tt, title, теперь хочу это делать в скритпе:

#!/bin/bash

echo -n "Преобразование WAV > MP3
Укажите битрейт: "; read br

tt=\"`echo "$w" | cut -d\/ -f2 | cut -d . -f1`\" \

find . -name "*.wav" | \
while read w; do
lame -b $br --tt=$tt \
"$w" "${w/%wav/mp3}"
done

#--ta "$ta" --tl "$tl" --ty $ty\
#--tt `echo "$w" | cut -d\/ -f2 | cut -d . -f1`\

Теперь файлы с пробелами он не пропускает, но позиция --tt пуста, при проигрывании mpg123

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

Вот, теперь работает.
Надо было делать так: --tt "`echo "$w" | cut -d\/ -f2 | cut -d . -f1`"
Кавычки, а в них коммандная подстановка.

#!/bin/bash

echo -n "Преобразование WAV > MP3
Укажите битрейт: "; read br
echo -n "Исполнитель: "; read ta
echo -n "Альбом: "; read tl
echo -n "Год: "; read ty

find . -name "*.wav" | \
while read w; do
lame -b $br --ta "$ta" --tl "$tl" --ty $ty\
--tt "`echo "$w" | cut -d\/ -f2 | cut -d . -f1`" \
"$w" "${w/%wav/mp3}"
done

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

ИМХО, в этом скрипте лучше использовать "башизмы":

#!/bin/bash
echo -n -e "Преобразование WAV > MP3\nУкажите битрейт: "
read br
find . -name "*.wav" | while read w; do
tt="${w#*/}" ; tt="${tt%.wav}" ;
lame -b $br --tt "$tt" "$w" "${w/%wav/mp3}"
done

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

Красиво. А башизм это что, вообще? Я книжки читаю, но конкретно, в чём здесь особенность баша? Это мне abs-book поможет? Как мозг перенастроить?

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

>>А башизм это что, вообще

часть скрипта, работающая только в баше. Другие шеллы выдадут sytax error. Ash/dash например, не поймёт $(( ... )).

>>Как мозг перенастроить?

# man bash > /dev/brain

:)

alex_custov ★★★★★
()

EXAMPLES
find /tmp -name core -type f -print | xargs /bin/rm -f

Find files named core in or below the directory /tmp and delete them. Note that this will work incorrectly if there are any filenames containing newlines, single or double quotes, or spaces.

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

Find files named core in or below the directory /tmp and delete them, processing filenames in such a way that file or directory names containing single or double quotes, spaces or newlines are cor‐
rectly handled. The -name test comes before the -type test in order to avoid having to call stat(2) on every file.

maloi ★★★★★
()

можно ещё, sed'ом например, заменить пробелы на нижние подчёркивания в именах файлов, после выполнения find...

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