У меня есть папка, названная учебными руководствами. В нем существует приблизительно 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
выполняется индивидуально в каждом подпапки, я могу получить корректный вывод.
Какие изменения я должен внести в вышеупомянутом коде для получения его работа?
Вы могли использовать это вместо этого, которое находит Вас всем Вашим 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
Необходимо заменить ./*.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