Я пытался открыть все мои файлы .mp3 из папки, используя xdg-open
, но обнаружил, что открывается только один! Поэтому я немного искал, но такого вопроса не было! Я нашел «evince», но, по-видимому, он открывает текстовые файлы, и gnome-open также открывает один файл.
Я хочу открыть все файлы одного формата в папке из терминала. Я новичок в Ubuntu, поэтому, пожалуйста, объясните немного больше.
В самом деле. Вы можете использовать оболочку, чтобы обойти это, например:
ls -b *.mp3 | xargs -n 1 xdg-open
Или, если вы хотите, чтобы это было более надежным, попробуйте
find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
Вы можете попробовать:
ls *.mp3 | while read -r file; do xdg-open "$file"; done
ls *.mp3
перечислить все mp3-файлы из текущего каталога, каждый в отдельной строке, и результат будет передан в цикл while
, который читает содержимое каждой строки, и оно откроет этот контент (в данном случае это имя mp3-файла) в приложении по умолчанию.
Вы можете использовать эти команды
cd /path/to/source_folder
find . -type f -name *.mp3 -exec vlc {} \+
, только если ваш музыкальный проигрыватель поддерживает несколько файлов в качестве аргументов командной строки. Замените vlc
на свой музыкальный проигрыватель.
Это работает с RhythmBox и VLC в моем тестировании.
Вот одна строка:
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
перенаправляет весь лот на программу, возвращаемую после подоболочки.
subshell:
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
, вы, вероятно, будете поражены тем, что рассматриваемое приложение может открывать каждый файл в новом экземпляре, что может стать уродливым более чем одним способом. Я написал этот 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
Особенности:
max=20 open $(ls -Q)
all=1 open $(ls -Q)
Используйте эту команду для файлов mp3, если вы хотите открывать файлы в VLC.
vlc /directory/*.mp3
Примечание. Используйте cvlc
для использования VLC без интерфейса.
Я написал небольшой скрипт /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
разного рода файлов, и некоторые команды все равно не будут принимать несколько аргументов.