我有一个很长的有序文件列表,其名称如下(视频)
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 -
将字段分隔符设置为-
(因此S1
、E1
等成为不同的字段)。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