Запустите FFmpeg из сценария оболочки - PullRequest
0 голосов
/ 02 июня 2010

Я нашел полезный сценарий оболочки, который рекурсивно показывает все файлы в каталоге.

Где печатается имя файла echo "$i"; #Display File name.

Вместо этого я хотел бы запустить команду ffmpeg для файлов, не относящихся к MP3, как я могу это сделать? У меня очень ограниченные знания сценариев оболочки, поэтому я ценю, если бы меня кормили ложкой! :)

//if file is NOT MP3

ffmpeg -i [the_file] -sameq [same_file_name_with_mp3_extension]

//delete old file

Вот сценарий оболочки для справки.

DIR="."

function list_files()
{
    if !(test -d "$1")  
    then echo $1; return;
    fi

    cd "$1"
    echo; echo `pwd`:; #Display Directory name

    for i in *
    do
               if test -d "$i"  #if dictionary
                then  
                          list_files "$i" #recursively list files
                  cd ..
                else
            echo "$i"; #Display File name
                fi

    done
}

if [ $# -eq 0 ]
then list_files .
exit 0
fi

for i in $*
do
    DIR="$1"
    list_files "$DIR"
    shift 1 #To read next directory/file name
done

Ответы [ 2 ]

5 голосов
/ 02 июня 2010

Вы можете сделать то же самое с помощью поиска одной строки. Предполагая, что все файлы, которые вы хотите обработать, имеют формат wav:

find /path/ -type f -name "*wav" -exec ffmpeg -i {} -sameq {}.mp3 \;

Если вы хотите найти файлы "rm" и удалить их после преобразования:

find /path/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {} \;

Тем не менее, если вы хотите сделать это с помощью сценария оболочки, который вы показали, возьмите строку с надписью

echo "$i";

замените его следующим:

ffmpeg -i "$i" -sameq "$i".mp3

$ i - это переменная. Несколько строк, у вас есть:

for i in *

это в основном означает «для каждого элемента в * (что, в свою очередь, обозначает все файлы в текущем каталоге, это то, что называется« расширением оболочки »), поместите имя элемента / файла в переменную i , а затем выполните весь код между «do» и «done» ». Таким образом, для каждой итерации i будет содержать имя одного из файлов в этом каталоге.

Также есть раздел, в котором проверяется, является ли i каталогом, и если это так, он рекурсивно перечисляет его содержимое.

Краткое заключительное примечание: \; в конце команды find имеет значение, и НУЖНО иметь пробел перед обратной косой чертой, иначе она не будет работать.

0 голосов
/ 02 июня 2010

Ваш сценарий оболочки, по сути, ls -1R, так что, вероятно, его проще использовать. Что касается запуска ffmpeg для файлов, не относящихся к MP3, вероятно, проще использовать find вместо написания всего сценария оболочки для этого. Предполагая, что вы идентифицируете файлы MP3 по их расширению:

find your-path -not -name "*.mp3" -exec ffmpeg -i '{}' -sameq '{}.mp3' \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...