2010-06-02 1 views
0

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

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

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

//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 

ответ

5

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

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

Если вы хотите найти файлы «Кт», и удалить их после преобразования:

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 - это каталог, и если да, то он рекурсивно перечисляет его содержимое.

Быстрое окончательное примечание: the \; в конце команды find IS значителен, и ему НЕОБХОДИМО иметь пробел перед обратным слэшем, иначе это не сработает.

+0

Они на самом деле все файлы rm. Эта одна строка находит файл, преобразует его и удаляет старый? !! – Abs

+0

Я обновил ответ, чтобы сделать то, что вы просите здесь. Протестируйте его несколькими отдельными файлами перед запуском пакета в вашем рабочем каталоге - я не беру на себя ответственность за удаленные файлы :) – Roadmaster

+0

- это команда 'rm', удаляющая старый файл (файл .rm)? Кстати, я очень ценю ваши объяснения, что делает вещи действительно ясными. – Abs

0

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

find your-path -not -name "*.mp3" -exec ffmpeg -i '{}' -sameq '{}.mp3' \; 

 Смежные вопросы

  • Нет связанных вопросов^_^