4

Я хотел бы удалить файл MP3, который в данный момент воспроизводится в mplayer . Если возможно, я бы хотел сделать это с помощью команды mplayer . Так что мне не нужно выходить из mplayer и удалять этот файл с помощью rm или открывать другой терминал и удалять файл там.

6 ответов6

3

Вы не можете удалить файл. Единственное, что может сделать пользователь, это вызвать unlink(2) (например, используя rm(1)), который удаляет имя файла из каталога, что приводит к уменьшению счетчика жестких ссылок. Только когда счетчик жестких ссылок достигнет нуля, и ни у одного приложения нет дескриптора открытого файла этого файла, тогда операционная система удалит этот файл.

Поскольку вы воспроизводите файл в mplayer будет открыт дескриптор файла, и файл не может быть удален. Тем не менее, системный вызов unlink(2) должен быть успешным. На практике это означает, что вы можете вызвать rm(1) для файла, но не ожидайте, что освободите место, пока не выйдете из mplayer .

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 из окна терминала, вы должны увидеть сообщение "Removed '/path/to/media/file.mp3'". Если вы не запускали его с помощью терминала, убедитесь, что файл был удален из его каталога.

* Переместите функцию playing() в собственный служебный скрипт для дальнейшей настройки.

1

Чтобы решить эту проблему, я добавил следующую строку в файл ~/.mplayer/input.conf:

DEL run "rm '${path}'"

Это заставляет ключ delete в mplayer запускать команду оболочки rm по полному пути файла, который mplayer воспроизводит в данный момент.

Обратите внимание, что часть ${path} заменяется самим mplayer: ${path} не является интерполяцией переменной оболочки.

К сожалению, тот факт, что mplayer настаивает на использовании оболочки для запуска команды, означает, что тщательно созданное имя файла для удаления может привести к ИСПОЛНЕНИЮ КОДА ОБОРОТОВ ОБОЛОЧКИ. Идеи для избежания этого приветствуются.

Также обратите внимание, что одинарные кавычки важны для работы с пробелами в пути к файлу, но не позволяют работать с файлами с одинарными кавычками в именах.

Также обратите внимание, что для этого не требуются сценарии оболочки или возиться с lsof , и, следовательно, он должен работать в любой операционной системе Unix-Y и работать с несколькими экземплярами mplayer, запущенными одновременно.

Точную документацию по командам можно найти в документации по режиму slave в mplayer.

0

Прежде всего, почему бы вам просто не попробовать и посмотреть? В любом случае, удаление из самого mplayer , вероятно, невозможно, почему у медиаплеера есть возможности манипулирования файлами? Это все равно что спросить, можете ли вы скопировать файлы с помощью acroread .

Удаление файла во время его воспроизведения не должно быть проблемой. Файл будет скопирован в оперативную память, как только программа откроет его, и вы сможете без проблем удалить файл с жесткого диска (только что проверил это с помощью mplayer). Windows не любит, когда вы это делаете, если я правильно помню, но я никогда не сталкивался с таким поведением в Linux.

0

Решения lkchoi и ndim у меня не сработали.

Поэтому я создаю систему, которую я называю "Цезарь", если песни плохие, я удаляю ее, если она хорошо переносится в другую папку.

Это полезно при выборе аудио, например, резервной копии WhatApp, которая является важной записью?

Фильтрация песен в огромном пакете Hair Metal, который я тоже использовал, очень проста:

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

mplayer echos "Playing" + название песни + расширение файла + тупая точка, я удалил их и смонтировал оператор, необходимый для удаления или перемещения.

Он будет отображать всю ожидаемую информацию, но вместо этого будет отображаться «Игра ...»:

rm "Absolute Hair Metal" том 56-111/Absolute Hair Metal том 100/06 Leatherwolf - The Calling.mp3 "mv" Absolute Hair Metal том 56-111/Absolute Hair Metal том 100/06 Leatherwolf - The Calling. mp3 "../saved

...

Я знаю, что раздражает дважды щелкнуть, затем нажать среднюю кнопку мыши, а затем нажать Enter. но другие решения перестали работать, и есть также некоторые проблемы безопасности.

Возможно, вам нужно изменить \n для \r. в результате чего:

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

Я не ожидаю, что это будет возможно. Хотя я сам не использовал mplayer, я думаю, что столкнулся с аналогичной ситуацией с Totem. По сути, поскольку приложение уже читает / получает доступ к файлу, вы не можете удалить его. По крайней мере, вам нужно остановить воспроизведение файла, прежде чем вы сможете удалить его, независимо от того, происходит это из mplayer или нет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .