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

Насколько я знаю, ответ на оба вопроса, к сожалению, «нет».

Подробности (но я все равно упрощаю):

брандмауэр, который активно информирует меня, когда какая-то программа пытается получить доступ к Интернету

фильтр чистой сети, который использует брандмауэры, не работает на уровне приложения, поэтому он не используется для этой цели. Хотя, как правило, можно фильтровать исходящие соединения (для всех программ), это сложно сделать, поскольку вы не можете блокировать подключения к порту 80 (используется для http - как раз используется в качестве примера здесь), что означает, что приложение-изгоя может легко использовать этот порт для соединения. Даже если это было возможно, было бы довольно сложно реализовать, так как соединения либо разрешены, либо заблокированы (а не «перехвачены» или «приостановлены», как, например, ZoneAlarm), поэтому у вас нет возможности активно разрешать или запрещать запрос «на лету». Одним из вариантов на уровне приложения будет AppArmor (вы можете ограничить подключение к Интернету, помимо прочего, там), но он не очень удобен для начинающих и гранулирован.

брандмауэр, который активно информирует меня, когда какая-то программа пытается получить доступ к Интернету

Фильтр ядра, который использует брандмауэры, не работает на уровне приложения, поэтому он не используется для этой цели. Хотя, как правило, можно фильтровать исходящие соединения (для всех программ), это сложно сделать, поскольку вы не можете блокировать подключения к порту 80 (используется для http - как раз используется в качестве примера здесь), что означает, что приложение-изгоя может легко использовать этот порт для соединения.
7
задан 26 September 2017 в 12:11

6 ответов

Вы можете использовать это вместо этого, которое находит все ваши 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
ответ дан 22 May 2018 в 18:06
  • 1
    Ах, хорошо, не мог прочитать это из вашего вопроса. Просто используйте сценарий, который я редактировал. Вы также можете создавать функции и вызывать их через параметр, который вы вызываете во время запуска скрипта. Таким образом, вы можете переключиться на то, что вы действительно хотите увидеть. Или вы просто оставляете их такими, чтобы всегда видеть все. – Ziazis 26 September 2017 в 13:12

Вы можете использовать это вместо этого, которое находит все ваши 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
ответ дан 18 July 2018 в 06:12

Вы можете использовать это вместо этого, которое находит все ваши 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
ответ дан 24 July 2018 в 18:32

Вы должны заменить ./*.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

. Ваш цикл for находит любые каталоги в ~ / 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
ответ дан 22 May 2018 в 18:06
  • 1
    Благодаря! забыл написать cd внутри цикла for. – Backspace 26 September 2017 в 12:28
  • 2
    Можем ли мы изменить его для вычисления суммы всех отдельных длительностей, полученных выше, и добавить их в конце вывода? – Backspace 26 September 2017 в 12:30
  • 3
    У вас будут проблемы, если имена когда-либо получат пробел или mp4 имеет странное имя. Тогда они не сработают. – Ziazis 26 September 2017 в 12:30
  • 4
    Хорошая точка @ Ziazis. Недостаток использования glob там, я думаю, я могу защитить имя каталога, указав, но не имена файлов. Можно было бы прокручивать файлы и использовать «exiftool» для каждого, делая дополнение за пределами команды exiftool, но я полагаю, что поиск - лучший подход. – Arronical 26 September 2017 в 12:41

Вы должны заменить ./*.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

. Ваш цикл for находит любые каталоги в ~ / 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
ответ дан 18 July 2018 в 06:12

Вы должны заменить ./*.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

. Ваш цикл for находит любые каталоги в ~ / 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
ответ дан 24 July 2018 в 18:32
  • 1
    Благодаря! забыл написать cd внутри цикла for. – Backspace 26 September 2017 в 12:28
  • 2
    Можем ли мы изменить его для вычисления суммы всех отдельных длительностей, полученных выше, и добавить их в конце вывода? – Backspace 26 September 2017 в 12:30
  • 3
    У вас будут проблемы, если имена когда-либо получат пробел или mp4 имеет странное имя. Тогда они не сработают. – Ziazis 26 September 2017 в 12:30
  • 4
    Хорошая точка @ Ziazis. Недостаток использования glob там, я думаю, я могу защитить имя каталога, указав, но не имена файлов. Можно было бы прокручивать файлы и использовать «exiftool» для каждого, делая дополнение за пределами команды exiftool, но я полагаю, что поиск - лучший подход. – Arronical 26 September 2017 в 12:41

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

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