如何比较时间日期字符串而不是实际日期和时间?

如何比较时间日期字符串而不是实际日期和时间?

我有一堆包含视频文件的目录,我想将它们合并成更大的视频。逻辑是文件名中包含日期时间戳,可用于确定哪些应该合并在一起。每个现有文件的长度不超过 3 分钟,然后创建另一个文件。如果文件名似乎只相隔 3 分钟,我想合并这些文件。如果下一个文件超过 3 分钟,则开始一个新文件。我删除了文件名的一部分以获取日期时间部分并尝试对其进行比较,但当时间超过小时时,我使用的计算不起作用。

我的文件如下所示:

20230425175113_002143A-Front.MP4
20230425175413_002146A-Front.MP4
20230425175714_002149A-Front.MP4
20230425180014_002152A-Front.MP4
20230425180313_002155A-Front.MP4
20230425180614_002158A-Front.MP4
20230425193016_002161A-Front.MP4
20230425175114_002145B-Middle.MP4
20230425175414_002148B-Middle.MP4
20230425175714_002151B-Middle.MP4
20230425180014_002154B-Middle.MP4
20230425180314_002157B-Middle.MP4
20230425180614_002160B-Middle.MP4
20230425193017_002162B-Middle.MP4
20230425175114_002144C-Rear.MP4
20230425175414_002147C-Rear.MP4
20230425175714_002150C-Rear.MP4
20230425180014_002153C-Rear.MP4
20230425180314_002156C-Rear.MP4
20230425180614_002159C-Rear.MP4
20230425193018_002163C-Rear.MP4

我正在尝试编写代码来合并文件,但前提是这些文件之间的时长在 2:59 到 3:01 分钟之间。前 6 个“正面”视频应该合并。前 6 个中间视频应该合并。前 6 个背面视频应该合并。

我从这段代码开始,但由于这些是时间字符串而不仅仅是数字,所以这不起作用:

#!/bin/bash

locations=( Front Middle Rear )

for location in "${locations[@]}"
do
    newfile=$(ls *$location.MP4 | head -n 1 | cut -f1 -d'_')
    curfile=$newfile
    for i in $(find . -type f -name "*$location.MP4" | sort);do 
        ifile=$(echo $i | cut -f1 -d'_' | sed 's/\.\///')
        if [[ $ifile -eq "$curfile" || $ifile -eq "$curhigh" || $ifile -eq "$curlow" ]]
        then
            cat "$i" >> "$newfile-$location.mp4"
            curfile=$ifile 
            curhigh=$ifile 
            curlow=$ifile 
            else
                cat "$i" >> "$newfile-$location.mp4" 
                curfile=$ifile 
                curhigh=$ifile 
                curlow=$ifile 
                newfile=$ifile 
        fi
        let curhigh+=301
        let curfile+=300
        let curlow+=299
    done
done

它确实适用于明显的关系,前 3 个是,但第四个比前一个晚 3 分钟,但因为它是及时的,所以没有写入计算时间。如果我可以进行正负 3 分钟的比较,那就最好了。我真正需要的是获取文件名,获取视频的长度,将其添加到文件名中,看看是否有一个带有该时间戳的新文件要合并,否则开始一个新的合并文件。但这要复杂得多。

答案1

使用 gnu date 或类似工具将它们解析为整数时间戳。

ts=$( date -ud "${i:0:4}-${i:4:2}-${i:6:2} ${i:8:2}:${i:10:2}:${i:12:2}" '+%s' )

从那里继续检查差异是否约为 180 秒。

相关内容