як відкрити декілька файлів за допомогою програми за замовчуванням з терміналу?


13

Я намагався відкрити всі .mp3 файли з папки за допомогою, xdg-open але виявив, що вона відкриває лише один! Тому я трохи пошукав, але такого питання не було! Я знайшов "evince", але, мабуть, він відкриває текстові файли, а gnome-open також відкриває один файл.

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


1
xdg-openдійсно має бути в змозі зробити це за замовчуванням ... просто передайте список аргументів програмі. Заходьте люди freedesktop.org! :-)
Ciro Santilli 冠状 病毒 审查 六四 事件

Відповіді:


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; FYI, новіші версії знаходять за замовчуванням ім'я шляху.
Agoston Horvath

Я не впевнений, що відсутність шляху - це проблема в другій (незважаючи на повідомлення про помилку). Я спробував ввести .і отримав те саме повідомлення про помилку. В іншому каталозі я потрапляю 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 - дякую за edititng.
Раду Радеану

@Braiam umm ... це не стосується mp3 та залежить від налаштувань програми за замовчуванням. Поведінка така ж, як і при відкритті декількох файлів від Nautilus або улюбленого файлового менеджера.
Radu Rădeanu

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різні типи файлів, а деякі команди в будь-якому випадку не прийматимуть декілька аргументів.


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-помилки, а не забруднює термінал або викидає його
  • За замовчуванням відкривається максимум 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 (і як за замовчуванням для mp3), це відкриває всі mp3-файли в каталозі з VLC для мене. Це не якийсь " універсальний-виріши-все-і-все-в-у-у-кожний ", - але це має працювати.

Пояснення:

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

grep "\.mp3\"$" вибирає лише файли, які закінчуються ".mp3" (плюс подвійне цитування).

xargs весь лот перенаправляє на програму, яка повертається після підзарядки.

нижня вартість:

xdg-mime query default audio/mpegдає ім'я програми за замовчуванням у форматі "app.desktop" для файлів, мім яких audio/mpeg. Ви можете перевірити mimetype на будь-який файл у вашому оточенні xdg-mime query filetype /path/to/file. Я отримав "аудіо / mpeg" для mp3-файлу.

grep -oP '.+(?=\.desktop)' отримує "додаток" від "app.desktop".

Якщо ви збираєтеся використовувати його дуже часто в системі, яка не зміниться сильно, ви можете скоротити її до цього:

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

Де ви заміняєте default_appфактичну програму, яка відкривається з файлами. Ви можете з'ясувати його ім'я за цим:

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


xdg-openне буде працювати з цією проблемою, оскільки вона приймає лише один аргумент за задумом. Якщо xargs -n1ви користуєтесь, ви, мабуть, потрапили в стіну, тому що отримана програма може відкрити кожен файл у новому екземплярі, який може стати некрасивим більш ніж одним способом.


-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

Просто +достатньо, не потрібно \+.
Grumbel

-1

Використовуйте цю команду для mp3-файлів, якщо ви хочете відкрити файли у VLC.

vlc /directory/*.mp3

Примітка. Використовуйте cvlcдля використання VLC без інтерфейсу.


3
Питання говорить про "програму за замовчуванням", тому використання VLC безпосередньо трохи ... безглуздо.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.