Откройте каталог в файловом менеджере по умолчанию и выберите файл


9

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

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

xdg-open /path/to/directory

Я знаю, что могу открыть каталог в nautilus и выбрать файл, используя

nautilus /path/to/file.txt

Я думал, что я мог бы использовать

xdg-mime query default inode/directory

чтобы получить файловый менеджер по умолчанию и - если это nautilus - вызвать его, как показано выше. Но, несмотря на то, что nautilus является настройкой по умолчанию в моей системе ( xdg-openоткрывает nautilus и меню мест в оболочке gnome), xdg-mimeвозвращается Thunar.desktop. (Я пытался, find / -name Thunar.desktop -mount 2>/dev/nullно ничего не нашел.)

Кроме того , я не знаю , как открыть каталог и выберите подраздел каталога в Nautilus (с упомянутым выше подходом было бы открыть поддиректорию).

Как я могу открыть каталог в файловом менеджере по умолчанию и выбрать файл в этом каталоге (если выбор каталога тоже возможен, это было бы здорово, но для этого приложения не требуется) или, по крайней мере, найти файловый менеджер по умолчанию, чтобы я можете позвонить напрямую?

Ответы:


6

1. Чтобы открыть каталог и выбрать подкаталог / файл в nautilus:

nautilus --select path/to/file/or/directory

Из справочной страницы nautilus (1) :

-s, --select
  Выбрать указанный URI в родительской папке.

2. xdg-mime возвращается, Thunar.desktopно xdg-openоткрываетсяnautilus

xdg-mimeиспользуется mimeapps.listдля определения приложения по умолчанию для использования.

mimeapps.listСуществуют отдельные файлы для обработки пользовательских, системных и дистрибутивных требований. Их порядок поиска можно найти здесь .

mimeapps.listперечисляет приложения по умолчанию для данного mimetype в разделе [Приложения по умолчанию]. Это позволяет перечислить несколько приложений по умолчанию в порядке убывания предпочтения. Например :

[Default Applications]
mimetype1 = default1.desktop;default2.desktop;

где mimetype1 - это тип mime, а * .desktop - файлы рабочего стола.

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

Итак, в случае нашего примера, давайте предположим, что default1.desktopв нашей системе его нет, поэтому xdg-openпопробуем открыть наш файл, используя default2.desktop. Однако xdg-mimeвозвращает, default1.desktopкоторый является первой записью в нашем mimeapps.listфайле.

В твоем случае default1.desktopдолжен быть Thunar.desktopотсюда вывод. Однако он не установлен в вашей системе. Так xdg-openоткрывает ваш файл / каталоги, используя nautilusкоторый присутствует в вашей системе. Чтобы убедиться в этом, вы можете проверить свой mimeapps.listфайл на наличие строки inode/directory. Для Ubuntu 17.10 расположение mimeapps.listфайла:/usr/share/applications/defaults.list

ПРИМЕЧАНИЕ . Полный алгоритм определения «приложений по умолчанию» можно найти здесь .


Если что-то осталось без ответа или если есть какая-то путаница, оставьте комментарий.
Амит Сингх

1
Ваш превосходный ответ на первый взгляд выглядел как вопрос (что является причиной удаления), он мог ввести в заблуждение рецензентов, поэтому я немного отредактировал его. Не стесняйтесь откатиться, если это не хорошо.
Петер - Восстановить Монику

@peterh Спасибо за редактирование! Я буду помнить это для будущих ответов.
Амит Сингх

+1. Большое спасибо за ваш ответ. Первая часть работает отлично. Вторая часть вместе с этой спецификацией, объясняющей, какие значения предполагаются, если переменные среды не установлены, объясняет, почему возвращается Thunar.
Якун

1
Тем не менее, я все еще не могу проследить, почему Наутилус запущен, потому что он не указан в mimeapps.list. Не могли бы вы объяснить, в чем заключаются эти ассоциации: «если после обработки всех файлов мы еще не нашли приложение по умолчанию, выберите наиболее предпочтительное приложение (в соответствии с ассоциациями), которое поддерживает тип»? Знаете ли вы, как узнать, какая программа будет запущена автоматически, без необходимости переопределения этого алгоритма?
Якун

0

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

Концепция файлового менеджера «по умолчанию» действительно существует только в том случае, если вы сосредоточены исключительно на xdg-mimedbus, и, действительно, на большинстве приложений, история принимает другой поворот, и концепция файлового менеджера «по умолчанию» перестает существовать.

Вот как вы открываете файл ( /home/me/path/to/folder/or/file) в файловом менеджере (по умолчанию?), Используя dbus:

dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:"file:///home/me/path/to/folder/or/file" string:""

Эта команда ищет любой сервис dbus, который реализует org.freedesktop.FileManager1интерфейс, и вызывает его с указанием пути к файлу, который вы хотите открыть.

Причина, по которой я ставлю знак вопроса после дефолта, заключается в том, что dbus не уважает концепцию файлового менеджера по умолчанию; все, что он делает, это отправляет вызов первой найденной службе, которая реализует интерфейс и позволяет ему обрабатывать операцию. Теперь может оказаться, что приложение, которое оно выбирает, является вашим файловым менеджером «по умолчанию», но это не всегда является гарантией.

Большинство современных приложений будут использовать dbusпо умолчанию, а затем использовать в xdg-mimeслучае сбоя вызова dbus, поэтому я рекомендую вам это сделать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.