LINUX.ORG.RU
решено ФорумAdmin

ЧЯДНТ? Bash, рекурсия по каталогам

 , ,


0

1

Есть куча видосов. Лежат в некоем месте. Вложенность директорий не ограничена.

Мне надо пройти скриптом и родить тумбнайл для каждого видео.

Скрипт я написал. Он пашет. Да вот не могу понять в каком месте я что-то сделал не так:

SHARED_MEDIA_DIR_PATH="/foo"
THUMBNAILS_DIR_PATH="/bar"


createThumbnails()
{
    local CURRENT_DIR_PATH=$(readlink -f "${1}")
    local FILE_NAME

    ls "${CURRENT_DIR_PATH}" -A1 | while read FILE_NAME; do

        local ITEM_PATH="${CURRENT_DIR_PATH}/${FILE_NAME}"

        if [ -d "${ITEM_PATH}" ]; then
            createThumbnails "${ITEM_PATH}"
            continue
        fi

        local MD5_SUM=$(printf '%s' "${ITEM_PATH}" | md5sum | cut -d ' ' -f 1)
        local THUMBNAIL="${THUMBNAILS_DIR_PATH}/${MD5_SUM}.jpg"

        if [ -f "${THUMBNAIL}" ]; then
            continue
        fi

        echo "${ITEM_PATH}"
        #echo "${THUMBNAIL}"

        ffmpeg \
            -ss $(ffmpeg -i "${ITEM_PATH}" 2>&1 \
                    | grep Duration \
                    | awk '{print $2}' \
                    | tr -d , \
                    | awk -F ':' '{print ($3+$2*60+$1*3600)/2}') \
            -i "${ITEM_PATH}" \
            -an \
            -vcodec mjpeg \
            -vframes 1 \
            -f rawvideo \
            -y \
            "${THUMBNAIL}" \
            >> /dev/null 2>&1

    done
}

createThumbnails "${SHARED_MEDIA_DIR_PATH}"

В некоей директории лежит 30 видео файлов с именами от 01 до 30 *.mp4.

Запускаю скрипт. Выводит:

/foo/бла бла/01.mp4
/foo/бла бла/.mp4
/foo/бла бла/03.mp4
/foo/бла бла/.mp4
/foo/бла бла/05.mp4
/foo/бла бла/6.mp4
/foo/бла бла/07.mp4
/foo/бла бла/8.mp4
/foo/бла бла/09.mp4
/foo/бла бла/.mp4
/foo/бла бла/11.mp4
/foo/бла бла/2.mp4
/foo/бла бла/13.mp4
/foo/бла бла/4.mp4
/foo/бла бла/15.mp4
/foo/бла бла/6.mp4
/foo/бла бла/17.mp4
/foo/бла бла/8.mp4
/foo/бла бла/19.mp4
/foo/бла бла/0.mp4
/foo/бла бла/21.mp4
/foo/бла бла/.mp4
/foo/бла бла/23.mp4
/foo/бла бла/4.mp4
/foo/бла бла/25.mp4
/foo/бла бла/6.mp4
/foo/бла бла/27.mp4
/foo/бла бла/8.mp4
/foo/бла бла/29.mp4
/foo/бла бла/0.mp4

И скрипт делает 15 тамбнейлов для 15 видео. Через один!!!

Вывод второго запуска отличается тем, что скрипт делает теперь 15 чётных:

/foo/бла бла/02.mp4
/foo/бла бла/3.mp4
/foo/бла бла/04.mp4
/foo/бла бла/5.mp4
/foo/бла бла/06.mp4
/foo/бла бла/7.mp4
/foo/бла бла/08.mp4
/foo/бла бла/9.mp4
/foo/бла бла/10.mp4
/foo/бла бла/.mp4
/foo/бла бла/12.mp4
/foo/бла бла/3.mp4
/foo/бла бла/14.mp4
/foo/бла бла/5.mp4
/foo/бла бла/16.mp4
/foo/бла бла/7.mp4
/foo/бла бла/18.mp4
/foo/бла бла/9.mp4
/foo/бла бла/20.mp4
/foo/бла бла/1.mp4
/foo/бла бла/22.mp4
/foo/бла бла/3.mp4
/foo/бла бла/24.mp4
/foo/бла бла/5.mp4
/foo/бла бла/26.mp4
/foo/бла бла/7.mp4
/foo/бла бла/28.mp4
/foo/бла бла/9.mp4
/foo/бла бла/30.mp4

И выводит какой-то мусор, на котором сам же спотыкается.

Что за хрень?

Интересно, что если закомментировать вызов ffmpeg, выводится всё правильно. Но как только я включаю собственно генерацию тамбнейлов — приехали.

ffmpeg как-то влияет на последовательность действий? Ставил sleep для каждой итерации — не помогло.

ЧЯДНТ?

★★★★★

Последнее исправление: deep-purple (всего исправлений: 1)

У меня без ffmpeg выводит корректно.
Закомменти ffmpeg: если и у тебя поправится, значит проблема в ffmpeg.

Kroz ★★★★★
()

Добавить -nostdin в вызов ffmpeg. 100500 тем уже было о том, что он жрёт стандартный ввод по умолчанию.

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

но обычно хватает

Ну по умолчанию globstar не включено, потому «обычности» тут как раз нет. Но таки да, надо выкинуть все эти «ls | read» и заменить на for dir/* и не придётся сражаться со странными именами и stdin. А правильнее ещё и массив с каталогами создавать, чтобы не переполнить стек при огромной вложенности каталогов.

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