Как я могу получить продолжительность всех видеофайлов в папке, содержащей несколько подпапок?

У меня есть папка, названная учебными руководствами. В нем существует приблизительно 15 папок каждый содержащий приблизительно 15-20 .mp4 видеофайлы. Я хочу получить общую продолжительность всех файлов, существующих в папке tutorials. Это - код, который я написал до сих пор:

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

Вышеупомянутый код при выполнении дает ошибку File not found: ./*.mp4 поскольку каждая из подпапок представляет в учебных руководствах. Однако, когда строка

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

выполняется индивидуально в каждом подпапки, я могу получить корректный вывод.

Какие изменения я должен внести в вышеупомянутом коде для получения его работа?

7
задан 26 September 2017 в 02:11

2 ответа

Вы могли использовать это вместо этого, которое находит Вас всем Вашим mp4 в определенной папке и всех подпапках и суммирует их продолжительность к общему количеству. Это проявляет также заботу, если у них есть специальные символы как пространство и т.д.

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

Видеть общие количества каждой подпапки также

#!/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
4
ответ дан 23 November 2019 в 06:28

Необходимо заменить ./*.mp4 с "$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

Ваш для цикла находит любые каталоги в ~/Videos/tutorials/и присваивает его путь к значению d переменная. Это - каталог, который Вы хотите проверить на mp4 файлы с exiftool, тогда как Вы говорите exiftool использовать текущий каталог с ./.

Другой подход был бы к cd к каталогу каждый раз, таким образом, Ваш код стал бы:

 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

Следующий подход может использоваться, если у Вас есть неприятные имена файлов для некоторых mp4 файлов, такой как содержащий пробелы. Это сохраняет имена файлов в массив и разворачивает их заключенный в кавычки в 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
5
ответ дан 23 November 2019 в 06:28

Другие вопросы по тегам:

Похожие вопросы: