查找缺失的数字

查找缺失的数字

我有一个很长的有序文件列表,其名称如下(视频)

S1-E18-(Date)-(Title)-(Random numbers).mp4

以下是列表的示例

S1-E1-20100526-title-of-video-1400316375.mp4
S1-E3-20100547-title-of-video-15457547.mp4
S10-E5-20100463-title-of-video-14467457.mp4

在这种情况下,很容易看出文件S1-E2丢失S10-E4了。但如果我有一个大列表,那么我该如何找到丢失的文件。(留下季节编号S1, S2)只需要检查E剧集编号

现有最大文件编号为S50-E2184 现有最小文件编号为S1-E1

答案1

使用 awk:

$ awk -F- '{n = substr($2, 2)} (n - prev) != 1 {for (i = prev + 1; i < n; i++) print i} {prev = n}' input-file
2
4
  • -F -将字段分隔符设置为-(因此S1E1等成为不同的字段)。
  • n = substr($2, 2)然后,我们通过从第二个字段()中取出除第一个字符之外的所有内容来提取剧集编号( ) $2
  • 如果剧集编号不是前一集 + 1 ( (n - prev) != 1),我们将打印中间的所有数字。
  • 我们将当前的情节编号保存起来prev以供下一次迭代。

如果输出未排序,则拆分提取并检查sort在其间插入:

awk -F- '{print substr($2, 2)}' input-file | sort -n | awk '{n=$1} (n - prev) != 1 {for (i = prev + 1; i < n; i++) print i} {prev = n}'

答案2

更直接一点的脚本。该脚本假设最后一集存在并提取其集数。然后它遍历 [1..last] 并检查其间所有集数是否存在。请注意,这不适用于以零开头的集数。

#!/bin/bash

if [ -z "$1" ]; then
    echo "please specify season prefix"
fi

# extract last episode number
last=`ls $1-*.* -1 --reverse | head -n 1 | grep --only-matching "E[[:digit:]+]" | cut -c 2-`

for ((i=1; i<=$last; i++)); do
    if [ ! -f $1-E$i-*.* ]; then
        echo "missing episode $i"
    fi
done

该脚本以季节前缀作为第一个参数,即 S1

相关内容