2017-09-09 3 views
0

J'écris un script simple pour itérer sur tous les fichiers m4a dans un dossier et les encoder en mp3. Je veux faire l'encodage des fichiers dans différents threads pour augmenter la vitesse d'exécution et tirer parti de tous les cœurs de mon PC, donc j'envoie les tâches en arrière-plan, merci de me conseiller si c'est la bonne approche. De toute façon, je reçois un Aucune erreur de fichier ou direcory pour chaque fichier que je veux encoder, même si le fichier est là; et la chose amusante est que si je copie exactement la même instruction à un terminal, il sera exécuté correctement. Pouvez-vous s'il vous plaît m'aider à découvrir ce que je fais mal?Script Bash ne trouvant pas de fichiers

Merci d'avance.

#!/bin/bash 

function encode { 
    echo "<<<<<<<<<<<encode>>>>>>>>>>>>>>>>" 
    cd "$1" 
    find . -mindepth 1 -maxdepth 1 | while read f 
    do 
     if [ -f "${f}" ] 
     then 
      if [ ${f: -4} == ".m4a" ] 
      then 
       if [ ! -d "converted" ] 
       then 
        mkdir converted 
       fi 
       newPath="${f%m4a}mp3" 
       echo "ffmpeg -i \""$f"\" -ac 2 -b:a 320k -y \""$newPath"\" </dev/null >/dev/null &" 
       ffmpeg -i \""$f"\" -ac 2 -b:a 320k -y \""$newPath"\" </dev/null >/dev/null & 
      fi 
     elif [ -d "${f}" ] 
     then 
      echo "folder $f" 
      encode "$f" 
     fi 
    done 
} 


encode "$1" 
+0

Vous avez trop de guillemets. – chepner

Répondre

0

Le problème auquel vous faites allusion est que vous ajoutez des guillemets littéraux au nom du fichier; "$f" est suffisant pour transmettre la valeur $f telle quelle à la commande ffmpeg. Vous n'avez pas besoin d'utiliser find pour parcourir le contenu immédiat d'un répertoire; il suffit d'utiliser un glob avec une boucle for (ce qui évite également d'avoir à arrêter ffmpeg à partir d'une entrée standard). Plus simplement, vous avez également besoin de encode pour restaurer le répertoire de travail d'origine avant qu'il ne retourne, de sorte que les appels récursifs ne modifient pas "de façon inattendue" le répertoire de travail lors de l'itération sur le répertoire en cours. pushd (au lieu de cd) et popd rendent ceci simple.

encode() { 
    echo "<<<<<<<<<<<encode>>>>>>>>>>>>>>>>" 
    pushd "$1" 
    for f in *; do 
    if [ -d "$f" ]; then 
     encode "$f" 
    elif [[ $f = *.m4a ]]; then 
     mkdir -p converted 
     newPath="${f%.m4a}.mp3" 
     ffmpeg -i "$f" -ac 2 -b:a 320k -y "$newPath" > /dev/null & 
    fi 
    done 
    popd 
} 
+0

Merci beaucoup, cela a fonctionné comme un charme. Il suffit d'ajouter le répertoire "converti" au chemin codé afin qu'il soit stocké dans le nouveau dossier créé. – user2751809