フォルダ内のビデオファイルを分析して、そのフォルダの合計ビデオ期間とそのフォルダとすべてのサブフォルダのビデオ期間を出力するbashスクリプトを作成しようとしています。私のコードは次のとおりです
#!/bin/bash
### Outputs the total duration of video in each folder (recursively).
## Incase an argument is not provided, the basefolder is assumed to be pwd.
# Defining custom Constants & functions
RED='\033[1;31m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
NC='\033[0m' # No Color
echoErr() {
echo -e "${RED}[ERROR]${NC}: $@" 1>&2
exit
}
folderTime() {
echo $(find . -maxdepth 1 -iname '*.mp4' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | paste -sd+ -| bc)
}
# Setting the base directory
if [ "$#" -lt 1 ]; then
baseDir="$(pwd)"
else
baseDir="$1"
fi
cd "$baseDir" || echoErr "Error switching to $baseDir"
# Actual calculation of the total video duration in each folder - using a function.
totalTime=0
function calcTime() {
local incomingTime=$totalTime
local newTotalTime=0
local immediateTime=0
newTotalTime=immediateTime=$(folderTime)
for f in "$1"*
do
if [ -d "$f" ]; then
cd "$f" || echoErr "Can't switch to $f"
calcTime "$f"
newTotalTime=$(( $newTotalTime + $totalTime ))
fi
done
totalTime=$(( $newTotalTime + $incomingTime ))
echo -e "The duration of video in just $f is : \t\t${BLUE}$immediateTime${NC}"
echo -e "The Total duration of video in $f and subfolders is : \t${GREEN}$totalTime${NC}"
}
calcTime "$baseDir"
上記のコードは出力を生成しませんが、実行も停止しません。私は初めてbashスクリプトに触れ、いくつかの間違いを犯したと確信していますが、それが何であるかを生涯知ることはできません。助けてください。
また、このスクリプトを改善する方法を教えてください。ありがとうございます!
ベストアンサー1
誤って再帰ループに自分自身をコーディングしました。問題はcalcTime()
関数の内部にあります。
for f in "$1"*
呼び出すと、pwd
末尾のスラッシュは省略されます。したがって、は常にに設定されfor f in "$1"*
ます。for f in "/my/current/directory*"
f
/my/current/directory
calcTime()
そのループ内で呼び出されるので無限に繰り返されます。 forループ定義を次のように変更すると、より良いパフォーマンスが得られると思います。
for f in "$1"/*