在默认文件管理器中打开一个目录并选择一个文件

jak*_*kun 13 xdg

在我正在编写的程序中,我想提供打开当前正在处理的文件所在目录的功能,并自动选择该文件(以便用户不需要搜索它)。

我知道我可以使用以下命令在默认文件管理器中打开一个目录

xdg-open /path/to/directory
Run Code Online (Sandbox Code Playgroud)

我知道我可以在 nautilus 中打开一个目录并使用

nautilus /path/to/file.txt
Run Code Online (Sandbox Code Playgroud)

以为我可以用

xdg-mime query default inode/directory
Run Code Online (Sandbox Code Playgroud)

获取默认文件管理器 - 如果它是 nautilus - 如上所示调用它。但是,尽管 nautilus 是我系统上的默认设置(xdg-open打开 nautilus 和 gnome shell 中的位置菜单),xdg-mime返回Thunar.desktop. (我试过了find / -name Thunar.desktop -mount 2>/dev/null但没有找到任何东西。)

另外,我不知道如何打开一个目录,然后选择一个子目录中的鹦鹉螺(与上面提到的方法,将打开子目录)。

我怎样才能打开默认的文件管理器的目录,并选择在该目录中的文件(如果选择一个目录,也很可能将是巨大的,但是对于这种应用并不需要),或至少找出默认的文件管理器,这样我可以直接调用吗?

小智 9

1.要在 nautilus 中打开一个目录并选择一个子目录/文件:

nautilus --select path/to/file/or/directory
Run Code Online (Sandbox Code Playgroud)

nautilus(1) 手册页

-s, --select
  在父文件夹中选择指定的 URI。

2. xdg-mime返回Thunar.desktopxdg-open打开nautilus

xdg-mime用于mimeapps.list确定要使用的默认应用程序。

mimeapps.list存在单独的文件来处理特定于用户、特定于系统和特定于发行版的要求。他们的查找顺序可以在这里找到。

mimeapps.list在 [Default Applications] 部分列出给定 mimetype 的默认应用程序。它允许按优先级的降序列出多个默认应用程序。例如 :

[Default Applications]
mimetype1 = default1.desktop;default2.desktop;
Run Code Online (Sandbox Code Playgroud)

其中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

注意:可以在此处找到确定“默认应用程序”的完整算法。


sma*_*c89 8

您可能需要考虑使用 dbus 打开文件,因为它很快变得越来越流行。

“默认”文件管理器的概念只有在您只专注于 时才真正存在xdg-mime,但是在 dbus 领域(实际上是大多数应用程序),情况会有所不同,并且“默认”文件的概念经理不复存在。

/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:""
Run Code Online (Sandbox Code Playgroud)

该命令的作用是查找任何实现该org.freedesktop.FileManager1接口的 dbus 服务,并使用您要打开的文件的路径来调用它。

我之所以在default后面打上问号,是因为dbus不尊重“默认”文件管理器的概念;它所做的只是将调用发送到它发现的第一个实现该接口的服务并让它处理该操作。现在它选择的应用程序可能是您的“默认”文件管理器,但这并不总是保证。

大多数现代应用程序将dbus默认使用,然后xdg-mime在 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/file1","file:///home/me/path/to/folder/or/file2" string:""
Run Code Online (Sandbox Code Playgroud)

根据 dbus 使用的文件管理器,打开多个文件时可能会出现不同的行为。一些用户抱怨 Thunar 为每个选定的文件打开一个新窗口(或新选项卡)。