![如何使用 CLI 获取 VLC 或其他媒体播放器中播放的媒体的标题?](https://linux22.com/image/78657/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20CLI%20%E8%8E%B7%E5%8F%96%20VLC%20%E6%88%96%E5%85%B6%E4%BB%96%E5%AA%92%E4%BD%93%E6%92%AD%E6%94%BE%E5%99%A8%E4%B8%AD%E6%92%AD%E6%94%BE%E7%9A%84%E5%AA%92%E4%BD%93%E7%9A%84%E6%A0%87%E9%A2%98%EF%BC%9F.png)
我想使用命令行获取 VLC 中播放的媒体的标题。我目前拥有的最接近的是这个命令。
ps aux | grep vlc
输出是
pc 27636 2.1 2.3 1261964 90028 ? Sl 21:46 0:23 /usr/bin/vlc --started-from-file /media/pc/Everything/TV shows/Discovery Channel - The History Of Hacking.avi
pc 28317 0.0 0.0 11748 2196 pts/0 S+ 22:05 0:00 grep --colour=auto vlc
答案1
我确信有一种很好、干净的方法可以做到这一点。可能是通过D-bus。可悲的是,我不知道那是什么,所以这里有一个更hacky的方法。您可以用来lsof
打印正在运行的进程打开的文件。这里的相关选项是(来自man lsof
):
-c c selects the listing of files for processes executing the
command that begins with the characters of c. Multiple commands
may be specified, using multiple -c options. They are joined in
a single ORed set before participating in AND option selection.
因此,lsof -c vlc
将列出名称以vlc
.然而,这将列出各种各样的东西,包括各种库和其他我们不关心的东西。输出的第四个字段lsof
(至少在我的 Arch 上)是文件的文件描述符(对于常规文件),后跟一个字母,描述文件打开的模式(r
在本例中为读取) 。第 5 个字段是文件类型,在这里,我们希望它是REG
常规的。将所有这些放在一起,我们得到(-w
抑制警告):
$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"'
vlc 16532 terdon 16r REG 8,19 131338 69731703 /path/to/foo.avi
要仅获取文件名,您可以使用 GNU grep
:
$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"' | grep -o '/.*'
/path/to/foo.avi
并仅获取文件名:
$ lsof -wc vlc | awk '$4~"[0-9]r" && $5=="REG"' | grep -o '[^/]*$'
foo.avi
答案2
我不确定您是在标题(位于文件元数据中)还是文件名(位于命令行中)之后。任何 ps 或 pgrep 都不会直接获取标题,但可以获取文件。您可以运行所有 vlc 及其命令行。
pgrep -a vlc
这将找到名称中包含 vlc 但不包含标志的任何进程,因此它与运行名为的二进制文件匹配一个带有 vlc 的程序但不是某个其他程序--flags--do-vlc
现在如何从命令行中提取文件名有点繁琐,您可能想通过 sed 运行它,但我想它会有点脆弱。
pgrep -a vlc | sed -r 's%^.*\/([^/.]+)%\1%g'
您将获得一个二进制名称中包含 vlc 的程序列表,输出是最后一个斜杠到点的所有内容。
你开始玩类似的东西/主页/电影/博士。英里数那你就不走运了。