LINUX.ORG.RU

Оптимизация bash скрипта. Пара вопросов по bash

 ,


0

2

Доброго времени суток. Пользуюсь скриптом для подготовки торрентов. Собственно по скрипту два вопроса. 1) В скрипте разбирается два случая - если внутри папки с торрентом есть папки, и если папки нет. Если есть папка

for dir in */; do
    for file in "$dir"*.mp4; do
Если нет папки
for file in *.mp4; do
2) Как можно в цикле for обработать несколько различных типов файлов?

Заменить for на find пытался. Не получилось.

#!/bin/bash

rm -f /var/www/*.torrent
dir=`mktemp -d`
cd "$@"
find . \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" \) -exec ffmpeg -y -ss 00:02:00 -i `basename {}` -f image2 -vframes 1 {}2.jpg \;
find . -type f -name "*.jpg" -print0 | xargs -0 mv -t $dir

tempfile=`mktemp`

imgupload -s ImageBan.ru -ct TableOfThumbnails -cl bbcode  $dir/*.jpg > $tempfile
dos2unix $tempfile
seq 1 8 | sed 'N;N;N;s/\n/ /g' $tempfile | pastebinit

find -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" \) -print0 | \
xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | \
perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
tail -n 1

rm -r "$dir"
rm $tempfile

for dir in */; do
    for file in "$dir"*.mp4; do
        mediainfo --Inform="Video;\[b\]Video #%StreamKindID%\[/b\]: %Codec/String%, %Width%x%Height% (%DisplayAspectRatio/String%), %FrameRate/String%, %Encoded_Library/Name% %Encoded_Library/Version% ~%BitRate/String% avg, %Bits-(Pixel*Frame)% bit/pixel\r\n" "$file"
        mediainfo --Inform="Audio;\[b\]Audio #%StreamKindID%\[/b\]: %SamplingRate/String%, %Codec/String%, %Channel(s)% ch, ~%BitRate_String%\r\n\r\n" "$file"
        break 1
    done
    break 1
done

for dir in */; do
    for file in "$dir"*.avi; do
        mediainfo --Inform="Video;\[b\]Video #%StreamKindID%\[/b\]: %Codec/String%, %Width%x%Height% (%DisplayAspectRatio/String%), %FrameRate/String%, %Encoded_Library/Name% %Encoded_Library/Version% ~%BitRate/String% avg, %Bits-(Pixel*Frame)% bit/pixel\r\n" "$file"
        mediainfo --Inform="Audio;\[b\]Audio #%StreamKindID%\[/b\]: %SamplingRate/String%, %Codec/String%, %Channel(s)% ch, ~%BitRate_String%\r\n\r\n" "$file"
        break 1
    done
    break 1
done

for file in *.mp4; do
    mediainfo --Inform="Video;\[b\]Video #%StreamKindID%\[/b\]: %Codec/String%, %Width%x%Height% (%DisplayAspectRatio/String%), %FrameRate/String%, %Encoded_Library/Name% %Encoded_Library/Version% ~%BitRate/String% avg, %Bits-(Pixel*Frame)% bit/pixel\r\n" "$file"
    mediainfo --Inform="Audio;\[b\]Audio #%StreamKindID%\[/b\]: %SamplingRate/String%, %Codec/String%, %Channel(s)% ch, ~%BitRate_String%\r\n\r\n" "$file"
    break 1
done

for file in *.avi; do
    mediainfo --Inform="Video;\[b\]Video #%StreamKindID%\[/b\]: %Codec/String%, %Width%x%Height% (%DisplayAspectRatio/String%), %FrameRate/String%, %Encoded_Library/Name% %Encoded_Library/Version% ~%BitRate/String% avg, %Bits-(Pixel*Frame)% bit/pixel\r\n" "$file"
    mediainfo --Inform="Audio;\[b\]Audio #%StreamKindID%\[/b\]: %SamplingRate/String%, %Codec/String%, %Channel(s)% ch, ~%BitRate_String%\r\n\r\n" "$file"
    break 1
done

cd ..

ctorrent -t -u "udp://tracker.openbittorrent.com:80/announce" -s "$@".torrent "$@"
mv "$@".torrent /var/www/
tree -H baseHREF "$@" > /var/www/listfiles.html

Добавь обязательно ./ перед всеми шаблонами, начинающимися с глоба, так как там может оказаться файл, начинающийся с дефиса и он будет воспринят как ключи программы.

А вообще скрипт жутковатый. Ты не думал о том, чтобы писать скрипт не на шелле, а например на Tcl?

Что должен делать find? Наверное, ты что-то не так делаешь. xargs тебе не нужен.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
for dir in */; do
    for file in "$dir"*.mp4; do
        mediainfo --Inform="Video;\[b\]Video #%StreamKindID%\[/b\]: %Codec/String%, %Width%x%Height% (%DisplayAspectRatio/String%), %FrameRate/String%, %Encoded_Library/Name% %Encoded_Library/Version% ~%BitRate/String% avg, %Bits-(Pixel*Frame)% bit/pixel\r\n" "$file"
        mediainfo --Inform="Audio;\[b\]Audio #%StreamKindID%\[/b\]: %SamplingRate/String%, %Codec/String%, %Channel(s)% ch, ~%BitRate_String%\r\n\r\n" "$file"
        break 1
    done
    break 1
done

Я не понял, тебе нужно вызвать mediainfo на первом попавшемся файле видео, так?

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

Tcl не знаю. find ищет видео файлы, делает скриншоты видео и складывает их в одну папку.

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

Можно применить вот такой метод:

find . -name '*.mp4' -execdir mediainfo {} \; -quit

Достаточно только почитать info find

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 3)
Ответ на: комментарий от chemtech

Замени эти тупые циклы этим:

find -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.flv" -o -iname "*.mov" -o -iname "*.mkv" \) \
   -exec mediainfo --Inform="Video;\[b\]Video #%StreamKindID%\[/b\]: %Codec/String%, %Width%x%Height% (%DisplayAspectRatio/String%), %FrameRate/String%, %Encoded_Library/Name% %Encoded_Library/Version% ~%BitRate/String% avg, %Bits-(Pixel*Frame)% bit/pixel\r\n" \{\} \; \
   -exec mediainfo --Inform="Audio;\[b\]Audio #%StreamKindID%\[/b\]: %SamplingRate/String%, %Codec/String%, %Channel(s)% ch, ~%BitRate_String%\r\n\r\n" \{\} \; \
   -quit

nexfwall ★★★★
()
Последнее исправление: nexfwall (всего исправлений: 1)

2) Как можно в цикле for обработать несколько различных типов файлов?

for file in *.{mp4,mkv}; do
surefire ★★★
()

Как можно в цикле for обработать несколько различных типов файлов?

не знаю, жуткововато или нет, но я что-то подобное вот так делал

D=="AUTHORS COPYING* ChangeLog Changelog CHANGELOG CONTRIBUTORS CREDITS "
D+="DEPENDENCIES FAQ gpl.txt HACKING INSTALL LICENSE* license MAINTAINERS "
D+="NEWS README* readme* Resources* THANKS* TODO ToDo VERSION "
DOC=""; for d in ${D}; do [ ! -z "`ls $d`" ] && DOC+="$d "; done
cp -av $DOC $PKG/usr/doc/$PRGNAM-$VERSION/

т.е. если файл какой-нибудь найден по маске из вывода ls, он приравнивается к переменной и как список наберется - копируется

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