我有一个带有名称的文件大列表(视频)
我设法将所有文件名写入一个文本文件中。现在我有一个包含大量文件名的文本文件(每行一个剧集)现在我需要一些可以读取该文本文件并告诉我E
缺少哪个剧集编号的东西
S1-E18-(Date)-(Title)-(Random numbers).mp4
以下是列表的示例
S1-E1-20100526-title-of-video-1400316375.mp4
S1-E3-20100517-title-of-video-15457547.mp4
S10-E5-20100421-title-of-video-14467457.mp4
S5-E7-20120912-title-of-video-17467457.mp4
在这种情况下,很容易看出文件S1-E2
丢失S10-E4
了。但如果我有一个大列表,那么我该如何找到丢失的文件。(留下季节编号S1, S2
)只需要检查E
剧集编号
现有最大文件编号为S50-E2184
现有最小文件编号为S1-E1
答案1
将所有名称保存在名为“file_with_list_of_files”的文件中,然后在 linux/unix 终端中运行以下命令[我在 mac 终端中尝试过]:
cat file_with_list_of_files | sed 's/^[A-Z][0-9]*-//g' | grep -v "^E"
- 或者 -
cat file_with_list_of_files | awk -F- '{print $2}' | grep -v "^E"
这列出了所有在第一个 -(连字符)后没有 E 的文件名。您可能还会找到其他更好的方法来实现这一点。
答案2
准备一个包含所有剧集签名的文件。你没有告诉我们每季有多少集,但你显然需要知道。准备文件的方法如下:
>all_episodes # just to empty the file which may or may not exist printf 'S1-E%s\n' {1..3} >>all_episodes # 3 episodes in season 1 printf 'S2-E%s\n' {1..5} >>all_episodes # 5 episodes in season 2 printf 'S3-E%s\n' {1..8} >>all_episodes # and so on printf 'S50-E%s\n' {1..2184} >>all_episodes
假设每季都以自己的第一集开始(您的问题没有明确说明)。该文件由格式为 的行组成
S<n>-E<m>
,例如S2-E3
。以相同形式创建拥有的剧集文件:
cut -d - -f -2 your_current_list >owned_episodes
该命令将
-
作为d消除符并返回行片段,直到F当前列表中的字段号 2。将其
owned_episodes
视为模式并进行过滤all_episodes
以查找没有任何模式的行:grep -vxFf owned_episodes all_episodes
注意我们在这里使用
-x
;要点是S50-E3
不应该匹配S50-E31
。-F
在你的情况下没有必要,但是一般来说应该在提供固定字符串时使用它。选项是:-F
使用固定字符串进行匹配。将指定的每个模式视为字符串而不是正则表达式。[...]-f pattern_file
从路径名指定的文件中读取一个或多个模式pattern_file
。[...]-v
选择与任何指定模式不匹配的行。 [...]-x
仅将使用行中所有字符(终止字符除外)<newline>
来匹配整个固定字符串或正则表达式的输入行视为匹配行。