LINUX.ORG.RU

[bash]пакетная обработка данных

 


0

1

Дано кусок кода, который упаковывает avi и srt в mkv

mkvmerge -o "/home/d/Видео/daria/season2/some.mkv"  "--forced-track" "0:no" "--language" "2:eng" "--default-track" "2:yes" "--forced-track" "2:no" "-a" "2" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "/home/d/Видео/daria_hi_qual/season2/some.avi" "--sub-charset" "0:CP1251" "--language" "0:rus" "--default-track" "0:yes" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "/home/d/Видео/daria_hi_qual/season2/ru_sub/some.srt" "--track-order" "0:0,0:2,1:0"
Как в помощью цикла совершить аналогичное действие последовательно несколько раз? Переменная some должна принимать значение «имя avi файла, без разрешения». Возможно, читать их построчно из текстового файла. Помогите, пожалуйста, реализовать данную задачу на баше.

Да, я ниосилятор :(


cat file | while read it; do 
    mkvmerge -o "/home/d/Видео/daria/season2/$it.mkv"  "--forced-track" "0:no" "--language" "2:eng" "--default-track" "2:yes" "--forced-track" "2:no" "-a" "2" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "/home/d/Видео/daria_hi_qual/season2/$it.avi" "--sub-charset" "0:CP1251" "--language" "0:rus" "--default-track" "0:yes" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "/home/d/Видео/daria_hi_qual/season2/ru_sub/$it.srt" "--track-order" "0:0,0:2,1:0";
done
nnz ★★★★
()
Ответ на: комментарий от xetf

>for i in «`cat file.txt`»; do mkvmerge..... ; done

Есть подозрение, что так оно прогонит цикл один раз, причем i будет содержать весь файл.
А без двойных кавычек оно будет некорректно обрабатывать имена файлов с пробелами.

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

> Есть подозрение, что так оно прогонит цикл один раз, причем i будет содержать весь файл.

Нет.

А без двойных кавычек оно будет некорректно обрабатывать имена файлов с пробелами.


В любом случае не будет. Разделитель - пробельный символ. Чтобы так файлы с пробелами обрабатывать, надо или пробел подменить заранее (а при работе с файлом, соответственно, обратно), или разделитель переопределить.

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

Нет.

Правда?

[nnz@imp ~]$ cat > tst.txt << EOF
> 123
> 456
> EOF
[nnz@imp ~]$ for it in "`cat tst.txt`"; do echo "a: $it"; done
a: 123
456
[nnz@imp ~]$ echo $BASH_VERSION
3.2.17(2)-release

Чтобы так файлы с пробелами обрабатывать, надо или пробел подменить заранее (а при работе с файлом, соответственно, обратно), или разделитель переопределить.

А еще проще использовать cat | while read, как я написал выше :)

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