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


4

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


从理论上讲,在大多数情况下这是可能的,但是OS不太可能允许它。您是否尝试过?如果是,您遇到了什么结果/错误?
Frank Thomas

是的,您可以在打开文件时“删除”文件。在最后一个具有打开文件句柄的应用程序将其关闭之前,这实际上不会删除该文件或删除使用的空间。不过,该文件将从您的直接列表中消失。(或者是硬链接,文件将从目录列表中消失,使用计数将减少1。当/如果达到0并且没有打开句柄,则仍将其删除)。
Hennes

Answers:


3

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

(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()函数移至其自己的实用程序脚本以进一步定制


3

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

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


我希望不要立即删除该文件。我可以等到我辞职的时候mplayer。我正在寻找一种告诉文件系统“在可能的情况下删除此文件” 的便捷方法。最好是mplayer本身。因此,我不必启动另一个终端,无需查找文件名并使用rm命令将其显式删除。
mabalenk

1

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

DEL run "rm '${path}'"

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

另外,${path}一部分被mplayer的本身取代:${path} shell变量插值。

不过,不幸的是,mplayer坚持使用外壳程序运行命令这一事实意味着,精心删除的文件名可能会导致执行任意外壳代码。避免这种情况的想法很受欢迎。

还要注意,单引号对于使此功能在文件路径中使用空格很重要,但对于在名称中带有单引号的文件,则停止使用单引号。

还要注意,这不需要shell脚本或不喜欢使用lsof,因此应在任何unix-y操作系统上运行,并与同时运行的mplayer的多个实例一起使用。

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


0

首先,为什么不试试看呢?无论如何,从mplayer自身删除可能是不可能的,为什么媒体播放器具有文件处理功能?这就像询问您是否可以使用来复制文件acroread

在播放文件时删除文件应该不是问题。程序打开后,文件将立即复制到RAM中,您可以毫无问题地从硬盘中删除文件(只需使用mplayer进行检查即可)。如果我没记错的话,Windows不喜欢你这样做,但是我从未在Linux中遇到过这种情况。


该文件未复制到RAM。它停留在相同的介质上,直到对它的最后一个引用(包括打开的文件描述符)不再存在。(当然,文件的某些部分缓存在RAM中,但这与取消链接操作无关。)
David Foerster,2013年

@DavidFoerster是否在复制时不会复制到RAM?我并不是说它将从文件系统中删除,但是在您访问它时应该将其加载到RAM中。
2013年

@terdon操作系统一定会将文件的一部分缓存在RAM中。但是mplayer不会将文件加载到RAM中,否则在观看视频时会消耗大量内存,并且视频大小必须小于RAM大小。
Marco Marco

是的,通常情况下,操作系统将至少部分地将文件缓存在RAM中,但是直到所有对它的引用都消失了,它才会删除原始文件。
David Foerster,2013年

0

lkchoi和ndim解决方案对我不起作用。

因此,我创建了一个名为“ Cesar”的系统,如果歌曲不好,我将其删除,如果很好,请移至另一个文件夹。

这在选择音频时非常有用,例如重要的录音是WhatApp备份?

在我还使用过的巨大的Hair Metal包中过滤歌曲,这很简单:

mplayer */*/*3 | sed "s@Playing \(.*\).\$@\nrm \"\1\"\nmv \"\1\" ../saved\n@"

mplayer回显“正在播放” +歌曲名+文件扩展名+哑点,我删除了这些内容并安装了删除或移动所需的语句。

它会回显所有预期的信息,但是显示正在播放...它将显示:

rm“绝对发金属Vol。56-111 /绝对发金属Vol。100/06 Leatherwolf-The Calling.mp3” mv“绝对发金属Vol。56-111 /绝对发金属Vol。100/06 Leatherwolf-呼叫。 mp3“ ../saved

...

我知道单击两次然后用鼠标中键粘贴然后按Enter键很烦人。但是其他解决方案停止工作,并且还存在一些安全问题。

也许您需要将\ n更改为\ r。结果:

mplayer */*/*3 | sed "s@Playing \(.*\).\$@\rrm \"\1\"\rmv \"\1\" ../saved\n@"

-2

我不希望这是可能的。虽然我自己还没有使用过mplayer,但我想在图腾中也遇到了类似的情况。基本上,由于应用程序已经在读取/访问文件,因此无法删除它。至少,无论是否在mplayer中发生,您都必须停止播放文件才能删除它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.