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
各サブフォルダー内で個別に実行され、正しい出力を得ることができます。
上記のコードを機能させるには、どのような変更を加える必要がありますか?
代わりにこれを使用して、特定のフォルダーとすべてのサブフォルダーにあるすべての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
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