如何从路径列表中 grep 系列标题?

如何从路径列表中 grep 系列标题?

我有以下命令:

find /home/cas/plex-media/series/ -type f -name '*.srt' | grep -v .en.srt

这将查找.srt不在.en.srt目录和子目录中的所有文件series

这将给我一个如下所示的列表:

/home/cas/plex-media/series/Scorpion/Season 4/Scorpion - S04E06 - Queen Scary.srt
/home/cas/plex-media/series/Scorpion/Season 4/Scorpion - S04E03 - Grow a Deer, A Female Deer.srt
/home/cas/plex-media/series/Devs/Season 1/Devs - S01E03 - Episode 3.srt
/home/cas/plex-media/series/Modern Family/Season 8/Modern Family - S08E21 - Alone Time.srt

这是简化版,输出可能有5个,也可能有300个,比如Scorpion可能有8个,也可能有50个,输出差别很大。

我尝试找到一个命令(我可以在原始命令后面进行传输),它将给我结果:

Scorpion, Devs, Modern Family

并不是:

Scorpion, Scorpion, Scorpion, Scorpion, Devs, Devs, Modern Family, Modern Family, Modern Family, 
Modern Family, Modern Family, Modern Family, etc.. 

你明白了。每个节目都有一个输出。而不是每个文件都有一个输出。

也可以是其他布局。其实这并不重要(尽管我更喜欢上面的布局)。

我一直在尝试使用 grep,但就是不行。所以我想问:您知道如何获得上述输出吗?

谢谢。

答案1

假设系列标题和文件名其余部分之间的分隔符是一致的空格-连字符-空格,则可以使用 awk 执行如下操作:

find . -type f -name '*.srt' ! -name '*.en.srt' -printf '%f\0' | 
  awk -v RS='\0' -F ' - ' '!seen[$1]++{print $1}' | paste -sd,

!seen[$1]构造对结果进行去重。最后一个paste命令将输出从换行符分隔的列表转换为逗号分隔的列表。

相关内容