para loop para executar um comando para todos os arquivos em uma pasta

2

Suponha que eu tenha uma pasta que contenha muitos arquivos de áudio. Como posso escrever um loop para que, para cada arquivo audioname.mp3 na pasta, essas vírgulas sejam executadas:

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

?

    
por user62511 14.11.2014 / 05:10

3 respostas

3

Por fim, acabei com esse script. Também funciona se seus arquivos .mp3 tiverem espaços em seus nomes de arquivos e sem extensão extra em novos arquivos criados.

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

para a descrição do primeiro comando converter veja Minha resposta no AskUbuntu

Explicação $(basename "$file" .mp3) :

Com o comando $(basename "$file") tentei obter apenas o nome do arquivo com extensão e com $(basename "$file" .mp3) removi sua extensão também.

$ 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

Explicação ${file%.*} :

Eu uso isso para obter o caminho de arquivo completo sem sua extensão.

$ 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

E com a próxima linha no script, você adicionará um rótulo .png criado em seus arquivos .mp3.

Observação: usei avconv em vez de ffmpeg . Você pode usar isso se não tiver o pacote ffmpeg instalado.

veja o demo convertido

    
por 14.11.2014 / 17:15
2

Pelo que entendi da sua pergunta, escrevi um script bash. Você pode por favor verificar se funciona corretamente para você?

#!/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
    
por 14.11.2014 / 06:05
0

Para converter todos os arquivos mp3 em uma pasta, você pode usar o seguinte código. Talvez você tenha que corrigir nomes de pastas se não quiser ter todos os arquivos em uma pasta.

#!/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
    
por 14.11.2014 / 08:16