2 votes

Pourquoi ce bash script ne fonctionne-t-il pas comme un service d'automate ?

Je ne connais que très peu de choses sur les scripts bash ou les commandes de terminal, tout ceci est très nouveau pour moi, alors soyez indulgent avec moi.


Original script

Je voudrais utiliser un script que j'ai trouvé sur littlefield.info comme un service d'automatisation. C'est le script original :

for file in *.flv *.mov *.mp4
  do mediainfo "--Inform=Video;%Duration%" $file
done | awk '{total+=$0}END{total=total/1000}END{print strftime("%H:%M:%S",total,1)}'

Expliqué par le créateur :

  1. Passez en revue tous les fichiers vidéo d'un dossier,
  2. En le passant au programme mediainfo, on obtient la durée en millisecondes,
  3. Nous passons ce résultat au programme awk pour additionner tous les chiffres et obtenir un total,
  4. En passant à nouveau à awk pour diviser ce nombre par 1000 et obtenir le nombre de secondes,
  5. En passant cela à la fonction strftime pour afficher le résultat au format Heures:Minutes:Secondes.

Modifié script

J'ai installé le mediainfo CLI et a commencé à expérimenter. Apparemment, strftime n'est pas disponible sur mac, donc j'ai dû chercher un autre moyen sur la façon de convertir les secondes en sortie lisible. J'ai bricolé le script suivant (probablement horriblement inefficace, mais hé ça marche) :

# the cd is needed for automator
cd "$1"

i=$(for file in *.flv *.mov *.mp4
        do mediainfo "--Inform=Video;%Duration%" $file
    done | awk '{total+=$0}END{print total}')

((i/=1000, sec=i%60, i/=60, min=i%60, hrs=i/60))
timestamp=$(printf "%dh%02dm%02ds" $hrs $min $sec)
echo -e "Total duration of video files in this folder:\n\n$timestamp" > _total_duration.txt

Il fonctionne parfaitement bien dans le Terminal. Mais l'exécuter en tant que service depuis le Finder donne le résultat suivant :

Durée totale des fichiers vidéo dans ce dossier :

0h00m00s

problème de variable awk

La durée ne devrait pas être 0. J'ai commencé à dépanner, et j'ai réduit le script à ce qui suit :

for file in *.flv *.mov *.mp4
    do mediainfo "--Inform=Video;%Duration%" $file
done | awk '{total+=$0}END{print total}'  > "test_file_awk.txt"

Il semble y avoir un problème avec la variable total en AWK. Il ne produit rien lorsqu'il est exécuté à partir du Finder mais fonctionne correctement à partir du Terminal.

Vous avez une idée de ce que je fais de mal ?

4voto

Alex Points 8703

Commençons par un petit exemple.

Lancez Automator et créez un service avec une seule étape "Run Shell script".

Configurez-le pour qu'il prenne les dossiers en entrée du Finder.

Passez les entrées comme arguments. Le shell est /bin/bash

Code Bash :

cd "$@"

for file in *.mov *.flk *.mp4
    do
    ls -1 "$file" >> ~/Desktop/test_file_awk.txt
done

Cette commande prend le répertoire que vous avez indiqué par "$@", y entre et exécute la commande sur tous les fichiers de ce répertoire.

"$@" est entre guillemets pour éviter les espaces, tout comme "$file".

Donc, vous pouvez reproduire cela dans votre installation :

cd "$@"
i=$(for file in {*.flv,*.mov,*.mp4,*.m4v}
    do 
    /usr/local/bin/mediainfo "--Inform=Video;%Duration%" "$file"
done | awk '{total+=$0}END{print total}')

((i/=1000, sec=i%60, i/=60, min=i%60, hrs=i/60))
timestamp=$(printf "%dh%02dm%02ds" $hrs $min $sec)
echo -e "Total duration of video files in this folder:\n\n$timestamp" > _total_duration.txt

Personnellement, je changerais la sortie en quelque chose comme :

> ~/Desktop/"$@"_total_duration.txt

Ainsi, les données se retrouvent sur votre bureau dans un fichier portant le nom du dossier, mais j'ai beaucoup de répertoires de médias et je ne veux pas de fichiers texte dans ceux-ci.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X