Abra um diretório no gerenciador de arquivos padrão e selecione um arquivo


9

Em um programa que estou escrevendo, desejo oferecer a funcionalidade de abrir o diretório em que o arquivo que estou processando no momento está localizado e selecionar automaticamente esse arquivo (para que o usuário não precise procurá-lo).

Eu sei que posso abrir um diretório no gerenciador de arquivos padrão usando

xdg-open /path/to/directory

Eu sei que posso abrir um diretório no nautilus e selecionar um arquivo usando

nautilus /path/to/file.txt

Eu pensei que eu poderia usar

xdg-mime query default inode/directory

para obter o gerenciador de arquivos padrão e - se for nautilus - chame-o como mostrado acima. Mas, apesar do fato de o nautilus ser o padrão no meu sistema ( xdg-openabre o nautilus e o menu de locais no shell do gnome), xdg-mimeretorna Thunar.desktop. (Eu tentei, find / -name Thunar.desktop -mount 2>/dev/nullmas não encontrou nada.)

Além disso, eu não sei como abrir um diretório e selecionar um sub diretório no Nautilus (com a abordagem acima indicado abriria o subdiretório).

Como posso abrir um diretório no gerenciador de arquivos padrão e selecionar um arquivo nesse diretório (se também fosse possível selecionar um diretório, seria ótimo, mas para esse aplicativo não é necessário) ou, pelo menos, descobrir o gerenciador de arquivos padrão para que eu pode chamá-lo diretamente?

Respostas:


6

1. Para abrir um diretório e selecione um subdiretório / arquivo no nautilus:

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

Na página do manual nautilus (1) :

-s, --select
  Selecione o URI especificado na pasta pai.

2. xdg-mime retorna Thunar.desktopmas xdg-openabrenautilus

xdg-mimeusa mimeapps.listpara determinar o aplicativo padrão a ser usado.

mimeapps.listExistem arquivos separados para lidar com requisitos específicos do usuário, do sistema e da distribuição. Sua ordem de pesquisa pode ser encontrada aqui .

mimeapps.listlista os aplicativos padrão para um determinado tipo de mimet na seção [Aplicativos padrão]. Ele permite listar vários aplicativos padrão em sua ordem decrescente de preferência. Por exemplo :

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

onde mimetype1 é o tipo MIME e * .desktop são os arquivos da área de trabalho.

xdg-openprocura por arquivo da área de trabalho na ordem de pesquisa, na lista de preferências até encontrar um arquivo válido da área de trabalho. Se nenhum arquivo for encontrado em todos os arquivos, o mais preferido de acordo com as associações será escolhido e usado como aplicativo padrão.

Portanto, no caso do nosso exemplo, suponhamos que default1.desktopnão esteja presente em nosso sistema, portanto xdg-open, tentaremos abrir nosso arquivo usando default2.desktop. No entanto, xdg-mimeretorna default1.desktopqual é a primeira entrada em nosso mimeapps.listarquivo.

No seu caso default1.desktopdeve ser, Thunar.desktopportanto, a saída. No entanto, ele não está instalado no seu sistema. Então xdg-openabre seu arquivo / diretórios usando o nautilusque está presente no seu sistema. Para verificar isso, você pode verificar se mimeapps.listhá linha contendo seu arquivo inode/directory. Para o Ubuntu 17.10, o local do mimeapps.listarquivo é:/usr/share/applications/defaults.list

NOTA: O algoritmo completo para determinar 'Aplicativos padrão' pode ser encontrado aqui .


Caso algo permaneça sem resposta ou se houver alguma confusão, envie um comentário.
Amit Singh

1
Sua excelente resposta parecia uma pergunta em primeiro lugar (o que é um motivo de exclusão), ela poderia enganar os revisores, então eu a editei um pouco. Sinta-se à vontade para reverter se não estiver correto.
peterh - Restabelece Monica

@ Peterh Obrigado pela edição! Vou manter isso em mente para respostas futuras.
Amit Singh

+1. Muito obrigado pela sua resposta. A primeira parte funciona perfeitamente. A segunda parte, juntamente com esta especificação, explica quais valores são assumidos se as variáveis ​​de ambiente não estiverem definidas, explicam por que o Thunar é retornado.
jakun

1
No entanto, ainda não consigo refazer o motivo pelo qual o Nautilus foi iniciado porque não está especificado em a mimeapps.list. Você pode explicar em que consiste essas associações "se, depois que todos os arquivos forem tratados, ainda não encontramos um aplicativo padrão, selecione o aplicativo mais preferido (de acordo com as associações) que suporta o tipo"? Você sabe como descobrir qual programa será iniciado automaticamente sem precisar reimplementar esse algoritmo?
Jkun #

0

Você pode considerar o uso do dbus para abrir seu arquivo, pois está rapidamente se tornando mais popular.

O conceito de um gerenciador de arquivos "padrão" só existe realmente se você estiver focado apenas xdg-mime, no entanto, no dbus land e na maioria das aplicações existentes, a história tem uma reviravolta diferente e o conceito de um gerenciador de arquivos "padrão" Deixa de existir.

É assim que você abre um arquivo ( /home/me/path/to/folder/or/file) no gerenciador de arquivos (padrão?), Usando o 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:""

O que este comando faz é procurar por qualquer serviço dbus que implemente a org.freedesktop.FileManager1interface e a chama com o caminho para o arquivo que você deseja abrir.

O motivo de eu colocar um ponto de interrogação após o padrão é porque o dbus não respeita o conceito de gerenciador de arquivos "padrão"; tudo o que faz é enviar a chamada para o primeiro serviço encontrado que implementa a interface e permite que ela lide com a operação. Agora pode ser que o aplicativo escolhido seja seu gerenciador de arquivos "padrão", mas isso nem sempre é uma garantia.

A maioria dos aplicativos modernos usará dbuspor padrão e fará o fallback para xdg-mimese a chamada do dbus falhar, então é isso que eu sugiro que você faça.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.