for loop для запуска команды для всех файлов в папке

Предположим, у меня есть папка, которая содержит много аудиофайлов. Как я могу написать цикл for так, чтобы для каждого файла audioname.mp3 в папке эти комбаты запускались:

 convert -size 300x200 xc:lightblue -font Bookman-DemiItalic -pointsize 40 -fill blue -gravity center -draw "text 0,0 'audioname'" audioname.png ffmpeg -i audioname.png -i audioname.mp3 audioname.flv 

?

3 Solutions collect form web for “for loop для запуска команды для всех файлов в папке”

Наконец я закончил с этим скриптом. Также работает, если ваши .mp3-файлы имеют пробелы в именах файлов и без дополнительного расширения в новых созданных файлах.

 for file in ~/Main_dir/*.mp3; do convert -background lightblue -size 300x200 -fill blue -pointsize 40 -gravity center label:"$(basename "$file" .mp3)" "${file%.*}.png"; avconv -i "${file%.*}.png" -i "${file%.*}.mp3" "${file%.*}.flv"; done 

для описания первой команды преобразования см. мой ответ на AskUbuntu

Объяснение $(basename "$file" .mp3) :

С командой $(basename "$file") я попытался получить только имя файла с расширением и с $(basename "$file" .mp3) Я также удалил его расширение.

 $ for file in ~/Main_dir/*.mp3; do echo $(basename "$file" .mp3);done 039 - Del Nevesht - noraei Eluveitie - Meet The Enemy 

 $ for file in ~/Main_dir/*.mp3; do echo $(basename "$file");done 039 - Del Nevesht - noraei.mp3 Eluveitie - Meet The Enemy.mp3 

Объяснение ${file%.*} :

Я использую это для получения полного пути к файлу без его расширения.

 $ for file in ~/Main_dir/*.mp3; do echo ${file%.*};done /home/KasiyA/Main_dir/039 - Del Nevesht - noraei /home/KasiyA/Main_dir/Eluveitie - Meet The Enemy 

И со следующей строкой в ​​скрипте вы добавите созданную метку .png в свои .mp3-файлы.

Примечание. Я использовал avconv вместо ffmpeg . Вы можете использовать это, если у вас нет пакета ffmpeg .

см. демоверсию

Из того, что я понял из вашего вопроса, я написал сценарий bash. Можете ли вы проверить, правильно ли он работает для вас?

 #!/bin/bash DIR="/path/to/directory" FILES=`ls -1 "$DIR" | grep mp3$` for file in "$FILES" do FILENAME=`echo "$file" | cut -d "." -f1` convert -size 300x200 xc:lightblue -font Bookman-DemiItalic -pointsize 40 -fill blue -gravity center -draw "text 0,0 '${FILENAME}'" ${FILENAME}.png ffmpeg -i ${FILENAME}.png -i $file ${FILENAME}.flv done 

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

 #!/bin/bash SRCPATH="/home/user" SRCEXT=".mp3" SRCFILES="($SRCPATH/*$SRCEXT)" cd $SRCPATH for FILE in "${SRCFILES[@]}"; do SELECTION="$(basename $FILE $SRCEXT)" convert -size 300x200 xc:lightblue -font Bookman-DemiItalic -pointsize 40 -fill blue -gravity center -draw "text 0,0 '$SELECTION'" $SELECTION.png ffmpeg -i $SELECTION.png -i $FILE $SELECTION.flv done 
  • Как получить имена файлов при использовании find и sed
  • Как переименовать многие файлы из любых последовательных имен файлов?
  • Если UID = 1000 продолжается, иначе выйдите
  • Создание текстового файла из других текстовых файлов
  • Поиск правильного dmp tmp на нескольких платформах
  • Какой смысл перенаправлять вывод grep на / dev / null?
  • Создание скрипта sh в программе
  • Замените все символы новой строки на пространство, за исключением последнего
  • Сценарий оболочки не работает, чтобы открыть LimeChat через терминал
  • Вставить в таблицу Oracle в цикле
  • Разрешить пользователям запускать только определенные двоичные файлы с правами root / привилегиями
  • Linux и Unix - лучшая ОС в мире.