web-dev-qa-db-ja.com

複数のサブフォルダーを含むフォルダー内のすべてのビデオファイルの期間を取得するにはどうすればよいですか?

tutorialsという名前のフォルダーがあります。その中には、約15〜20個の.mp4ビデオファイルを含む約15個のフォルダーがあります。フォルダ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

上記のコードを実行すると、tutorials内にある各サブフォルダーに対してFile not found: ./*.mp4エラーが発生します。ただし、

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

各サブフォルダー内で個別に実行され、正しい出力を得ることができます。

上記のコードを機能させるには、どのような変更を加える必要がありますか?

7
Backspace

代わりにこれを使用して、特定のフォルダーとすべてのサブフォルダーにあるすべての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
Ziazis

./*.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変数の値に割り当てています。これはexiftoolでmp4ファイルを確認するディレクトリですが、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
Arronical