我有以下命令:
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
命令将输出从换行符分隔的列表转换为逗号分隔的列表。