我正在尝试编写一个 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"/*