Perché questo script di bash non funziona come un servizio di automazione?

1

So molto poco di scripting bash o di comandi Terminal, questo è tutto molto nuovo per me quindi per favore portami con me.

Script originale

Vorrei usare uno script che ho trovato su littlefield.info come servizio di automazione. Questo è lo script originale:

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)}'

Spiegato dal creatore:

  1. Cycle through every video file in a folder,
  2. Passing it to the mediainfo program to extract the duration in milliseconds,
  3. Passing that result to the awk program to add up all the numbers to give us a total,
  4. Passing that to awk again to divide that number by 1000 to give the number of seconds,
  5. Passing that that to the strftime function to display the result in Hours:Minutes:Seconds format.

Script modificato

Ho installato la mediainfo CLI e ho iniziato a sperimentare. Apparentemente strftime non è disponibile su mac, quindi ho dovuto cercare un altro modo su come convertire i secondi in output leggibili. Ho messo insieme il seguente script (probabilmente orribilmente inefficiente, ma hey .. funziona):

# 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

Funziona perfettamente bene in Terminal. Ma eseguirlo come un servizio da Finder fornisce il seguente output:

Total duration of video files in this folder:

0h00m00s

awk problema variabile

La durata non dovrebbe essere 0. Ho iniziato la risoluzione dei problemi e ho ridotto lo script al seguente:

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

Sembra che ci sia un problema con la variabile total in AWK. Non emette alcunché quando viene eseguito da Finder ma funziona correttamente da Terminale.

Ragazzi avete idea di cosa sto facendo male?

    
posta Kymer 15.08.2014 - 03:28
fonte

1 risposta

3

Iniziamo con un piccolo esempio.

Avvia Automator e crea un servizio con un singolo passaggio "Esegui script di shell".

Impostalo per prendere le cartelle come input dal Finder

Passa l'input come argomento. Shell è / bin / bash

Codice hash:

cd "$@"

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

Ciò che serve è la directory che si passa come "$ @" e va dentro quindi esegue il comando su tutti i file in quella directory.

"$ @" è tra virgolette per proteggere dagli spazi, così come "$ file"

Quindi, puoi replicare questo alla tua configurazione:

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

Personalmente, cambierei l'output in qualcosa tipo:

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

In modo che i dati finiscano sul desktop in un file chiamato per la cartella, ma ho molte directory multimediali e non voglio file txt in esse.

    
risposta data 15.08.2014 - 04:28
fonte

Leggi altre domande sui tag