是否可以删除 mplayer 中当前播放的 MP3 文件?

是否可以删除 mplayer 中当前播放的 MP3 文件?

我想删除当前正在播放的 MP3 文件mplayer。如果可能的话,我想使用命令来执行此操作mplayer。这样我就不必退出mplayer并使用删除此文件rm或打开另一个终端并在那里删除该文件。

答案1

是的,可以而且很容易。我使用以下修改版本来整理/修剪我的媒体收藏。

(1)保存以下 bash 脚本(rmplaying.sh)

#/bin/bash
# rmplaying.sh
# only works when exactly 1 instance of mplayer is running
function playing {
PID=`pidof mplayer`
WHICH=`which mplayer`
if [ $PID ]; then
    lsof -p $PID | awk '{ if ($5=="REG" && $4!="mem" && $9)print $0 }' | grep -v "$WHICH" | grep -oP '\/.*'
fi
}

FILE="$(playing)"
echo "file: $FILE"
if [ "$FILE" ]; then
  rm "$FILE" && echo "Removed '$FILE'"
fi

(2)设置权限允许其执行

chmod +x rmplaying.sh

(3)编辑或创建文件“~/.mplayer/input.conf”并添加以下行

Ctrl+d run "/path/to/rmplaying.sh"

就是这样。

要进行测试,请使用 mplayer 播放文件并按“Ctrl+d”。文件将通过“rm”命令删除,但媒体将继续播放。

如果您从终端窗口启动了 mplayer,则应该会看到消息“已删除‘/path/to/media/file.mp3’”。如果您没有使用终端启动它,请检查该文件是否已从其目录中删除。

*将 playing() 函数移至其自己的实用脚本,以便进一步定制

答案2

您无法删除文件。用户唯一能做的就是调用unlink(2)(例如使用rm(1)) 会从目录中删除文件名,从而导致硬链接计数器减少。只有当硬链接计数器达到零并且没有应用程序拥有此文件的打开文件句柄时,操作系统才会删除该文件。

由于您播放该文件,mplayer因此将有一个打开的文件句柄,并且该文件无法删除。unlink(2)尽管如此,系统调用应该会成功。实际上,这意味着你可以调用rm(1)但是不要指望在退出之前能够释放空间mplayer

答案3

为了解决这个问题,我在文件中添加了以下行~/.mplayer/input.conf

DEL run "rm '${path}'"

这使得mplayer 中的键在mplayer 当前正在播放的文件的完整路径上delete运行 shell 命令。rm

注意该${path}部分被 mplayer 本身替代了${path}不是壳变量插值。

但不幸的是,mplayer 坚持使用 shell 来运行命令,这意味着精心设计的删除文件名可能会导致执行任意 shell 代码。欢迎提出避免这种情况的想法。

还要注意,单引号对于文件路径中的空格非常重要,但对于名称中带有单引号的文件,单引号会停止工作。

还要注意,这不需要 shell 脚本或摆弄lsof,因此应该在任何 unix-y 操作系统上运行,并且可以与同时运行的多个 mplayer 实例一起工作。

确切的命令文档可以在 mplayer 的从属模式文档

答案4

首先,你为什么不尝试看看?无论如何,从mplayer自身删除可能是不可能的,媒体播放器为什么会有文件操作能力?这就像问你是否可以使用复制文件一样acroread

在播放文件时删除它应该不是问题。只要程序打开文件,文件就会被复制到 RAM 中,您可以毫无问题地从硬盘中删除文件(刚刚使用 mplayer 检查了这一点)。如果我没记错的话,Windows 不喜欢你这样做,但我从未在 Linux 中遇到过这种行为。

相关内容