Как открыть несколько файлов с программой по умолчанию из терминала?

13

Я пытался открыть все мои файлы .mp3 из папки, используя, xdg-open но я обнаружил, что он открывает только один! Поэтому я немного искал, но такого вопроса не было! Я нашел «evince», но, видимо, он открывает текстовые файлы, и gnome-open также открывает один файл.

Я хочу открыть все файлы одного формата в папке из терминала. Я новичок в Ubuntu, поэтому, пожалуйста, объясните немного больше.

каро
источник
1
xdg-openдействительно должен быть в состоянии сделать это по умолчанию ... просто передайте список аргументов программе. Заходите на freedesktop.org люди! :-)
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

8

В самом деле. Вы можете использовать оболочку, чтобы обойти это, как это:

ls -b *.mp3 | xargs -n 1 xdg-open

Или, если вы хотите более надежный, попробуйте

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
Агостон Хорват
источник
Первый не работает с файлами с пробелами в имени, а второй вообще не работает ( find: paths must precede expression: -).
Sparhawk
1
Если вы читаете внимательно, я написал «если вы хотите, чтобы он был более надежным ...», следовательно, первая, простая версия действительно не работает с пробелами, но это не было целью. Второе решение работает с Ubuntu; К вашему сведению, более новые версии находят по умолчанию путь к.
Агостон Хорват
Я не уверен, что отсутствие пути является проблемой во втором (несмотря на сообщение об ошибке). Я попытался вставить .и получил то же самое сообщение об ошибке. В другой каталог я попадаю xdg-open: unexpected argument './foo.mp3'с или без ..
Sparhawk
Кроме того, я думаю, что наличие пробелов в именах не является настолько редким сценарием, что его следует игнорировать даже в «простых» случаях.
Sparhawk
Я не знаю достаточно о вашей конкретной установке, чтобы сказать наверняка, но xdg-open работает, как я описал при новой установке Ubuntu. Смотрите man xdg-open, если не уверены.
Агостон Хорват
4

Можешь попробовать:

ls *.mp3 | while read -r file; do xdg-open "$file"; done

ls *.mp3перечислит все mp3-файлы из текущего каталога, каждый в отдельной строке, и результат будет передан в whileцикл, который прочитает содержимое каждой строки, и он откроет это содержимое (в данном случае это имя mp3-файла). ) в приложении по умолчанию.

Раду Рэдяну
источник
@karel Я добавил -rфлаг. Я думаю, что это необходимо для правильного разбора файлов с `\` в их имени.
Sparhawk
2
хм ... не открыть ли несколько экземпляров одной и той же программы?
Брайам
@karel Да ... у меня man readтоже нет флагов! Я не получаю ошибку в моем тестировании, но это, вероятно, потому что я создал aaaи aa\a. В этом случае xdg-openпросто пытается aaaдважды открыть , а нет aa\a. (Хорошо, это становится немного запутанным, но я думаю, что код должен работать для всех ситуаций. Возможно find, это лучший вариант, чтобы избежать ограничений lsи read.) Кроме того, как он может привести к хаосу точно? Разве это не собирается только анализировать вывод ls?
Sparhawk
@karel man readссылается на прочитанную функцию C (раздел 2 человека). Это readвстроенная команда bash, поэтому вы должны заглянуть man bashкуда-нибудь в строку 4632. @Sparhawk - спасибо за редактирование.
Раду Рэдяну
@ Braiam ммм ... это не относится к mp3 и зависит от настроек из приложения по умолчанию. Поведение такое же, как при открытии нескольких файлов из Nautilus или из вашего любимого файлового менеджера.
Раду Рэдяну
4

Я написал небольшой скрипт /usr/local/bin/o, хотя вы можете просто вызвать его /usr/local/bin/xdg-openи заменить команду по умолчанию, если хотите (при условии, что ваша команда $PATHотдает ей приоритет). Также, если аргумент не указан, этот скрипт откроет текущий каталог.

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open . &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi

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

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi

Примечание: это не зависит от способности программы по умолчанию анализировать несколько аргументов, но вместо этого она будет вызывать каждую команду один раз для каждого аргумента. Я не думаю, что есть элегантный способ обойти это, так как пользователи могут захотеть использовать xdg-openразные типы файлов, и некоторые команды все равно не будут принимать несколько аргументов.

Sparhawk
источник
1

Я написал этот bashсценарий, чтобы охватить все возможные варианты использования:

#!/bin/bash
set -euo pipefail; shopt -s failglob # bash strict mode

max=${max:-10} # Set default maximum if $max is not set
[[ ${all:-} ]] && max=$# # Set max to all files if $all is non-null

for file in "${@:1:$max}"; do
  xdg-open "$file"
done &>>~/.xsession-errors

Функции:

  • Записывает вывод ошибок в ~ / .xsession-errors вместо того, чтобы загрязнять терминал или выбрасывать его
  • По умолчанию открывается максимум 10 файлов (чтобы не перегружать экран / процессор)
  • Можно установить новый максимум с max=20 open $(ls -Q)
  • Разрешить открытие всех файлов, например all=1 open $(ls -Q)
Том Хейл
источник
0

Вот одна строка:

ls -AQp | grep "\.mp3\"$" | xargs `xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'`

Поскольку у меня установлен VLC (и по умолчанию для mp3s), это открывает все mp3-файлы в каталоге с VLC для меня. Это не какой-то « универсальный способ решить все и работать в каждом безумном случае », но он должен работать.

Объяснение:

ls -AQpперечисляет «почти все» файлы, цитируя имена файлов и добавляя косую черту к именам каталогов. Замените -pна, --file-typeесли вы также хотите исключить символические ссылки. Цитирование в случае пробелов в именах файлов.

grep "\.mp3\"$" выбирает только файлы, оканчивающиеся на «.mp3» (плюс двойные кавычки).

xargs перенаправляет весь лот на программирование, которое возвращается после подоболочки.

подоболочка:

xdg-mime query default audio/mpegдает имя приложения по умолчанию в формате "app.desktop" для файлов с mime audio/mpeg. Вы можете проверить mimetype для любого файла в вашей среде с помощью xdg-mime query filetype /path/to/file. Я получил "аудио / MPEG" для mp3-файла.

grep -oP '.+(?=\.desktop)' получает "app" из "app.desktop".

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

ls -AQp | grep "\.mp3\"$" | xargs default_app

Где вы замените default_appна фактическую программу, которая открывается с файлами. Вы можете выяснить его имя с этим:

xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'


xdg-openне будет работать с этой проблемой, потому что она принимает только один аргумент по замыслу. Если xargs -n1вы используете , вы, вероятно, будете в восторге от того, что рассматриваемое приложение может открывать каждый файл в новом экземпляре, что может стать уродливым несколькими способами.

F-3000
источник
-1

Вы можете использовать эти команды

cd /path/to/source_folder

find . -type f -name *.mp3 -exec vlc {} \+

только если ваш музыкальный проигрыватель поддерживает несколько файлов в качестве аргументов командной строки. Замените vlcна ваш музыкальный плеер по вашему выбору.

Это работает с RhythmBox и VLC в моем тестировании.

харакири
источник
Не find... -execзапускает отдельные команды для каждого файла? А также, если ваш музыкальный проигрыватель поддерживает несколько файлов в качестве аргументов командной строки, вы можете просто использовать vlc *.mp3.
Sparhawk
@ Sparhawk Не с \+в конце
AB
@AB Ах, да, хорошая мысль; Я был неправ. Однако, согласно моему второму предложению, кажется, что использовать бессмысленно, findесли вы все vlcравно собираетесь использовать жесткий код. (Вопрос предполагает, что все они находятся в одном каталоге.)
Sparhawk
Просто +достаточно, не нужно \+.
Грамбель
-1

Используйте эту команду для mp3-файлов, если вы хотите открыть файлы в VLC.

vlc /directory/*.mp3

Примечание. Используйте cvlcдля использования VLC без интерфейса.

каро
источник
3
Вопрос говорит «программа по умолчанию», поэтому использование VLC напрямую немного ... бессмысленно.
Муру