Como posso obter a duração de todos os arquivos de vídeo em uma pasta contendo várias subpastas?

7

Eu tenho uma pasta chamada tutoriais . Dentro dele, existem cerca de 15 pastas, cada uma contendo cerca de 15-20% de arquivos de vídeo.mp4. Desejo obter a duração total de todos os arquivos presentes na pasta tutorials . Este é o código que escrevi até agora:

 for d in ~/Videos/tutorials/*; do
   if [ -d "$d" ]; then
     exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1
   fi
 done

O código acima, quando executado, dá um erro File not found: ./*.mp4 para cada uma das subpastas presentes dentro de tutoriais . No entanto, quando a linha

exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1

é executado individualmente dentro de cada subpasta, eu sou capaz de obter a saída correta.

Que mudanças devo fazer no código acima para que funcione?

    
por Backspace 26.09.2017 / 10:24

2 respostas

4

Você pode usar isso em vez disso, o que encontra todos os seus mp4 em uma pasta específica e em todas as subpastas e soma a duração deles a um total. Isso também exige que eles tenham caracteres especiais, como um espaço, etc.

find ~/Videos/tutorials/ -name "*.mp4" -printf "\"%p\" " | xargs exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n 1

Para ver os totais de todas as subpastas, também

#!/bin/bash

SEARCHPATH=~/Videos/tutorials

echo "## TOTAL OF EVERY MP4"
find  $SEARCHPATH -name "*.mp4" -printf "\"%p\" " | xargs exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n 1

find $SEARCHPATH -type d  > /tmp/allFolders.txt

while read -r; do
echo "## TOTAL OF $REPLY"
find "$REPLY" -maxdepth 1 -name "*.mp4" -printf "\"%p\" " | xargs exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' | tail -n 1
done < /tmp/allFolders.txt

#cleanup
rm /tmp/allFolders.txt
    
por Ziazis 26.09.2017 / 11:32
5

Você deve substituir ./*.mp4 por "$d"/*.mp4 :

 for d in ~/Videos/tutorials/*; do
   if [ -d "$d" ]; then
     exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' "$d"/*.mp4| tail -n1
   fi
 done

O seu loop está encontrando diretórios em ~ / Videos / tutorials / e atribuindo seu caminho ao valor da variável d . Esse é o diretório que você deseja verificar para arquivos mp4 com exiftool, enquanto você está dizendo exiftool para usar o diretório atual com ./ .

Outra abordagem seria cd para o diretório a cada vez, então seu código se tornaria:

 for d in ~/Videos/tutorials/*; do
   if [ -d "$d" ]; then
     cd "$d"
     exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' ./*.mp4| tail -n1
   fi
 done

A seguinte abordagem pode ser usada se você tiver nomes de arquivos problemáticos para alguns dos arquivos mp4, como espaços contendo. Ele salva os nomes dos arquivos em uma matriz e os expande, citados no comando exiftool .

 for d in ~/Videos/tutorials/*; do
       if [ -d "$d" ]; then
         cd "$d"
         files=(./*.mp4)         
         exiftool -n -q -p '${Duration;our $sum;$_=ConvertDuration($sum+=$_)}' "${files[@]}"| tail -n1
       fi
     done
    
por Arronical 26.09.2017 / 10:47