기본 파일 관리자에서 디렉터리를 열고 파일을 선택합니다.

기본 파일 관리자에서 디렉터리를 열고 파일을 선택합니다.

내가 작성 중인 프로그램에서 현재 작업 중인 파일이 포함된 디렉토리를 열고 자동으로 해당 파일을 선택하는 기능을 제공하고 싶습니다(그래서 사용자는 해당 파일을 검색할 필요가 없습니다).

다음을 사용하여 기본 파일 관리자에서 디렉토리를 열 수 있다는 것을 알고 있습니다.

xdg-open /path/to/directory

노틸러스에서 디렉토리를 열고 다음을 사용하여 파일을 선택할 수 있다는 것을 알고 있습니다.

nautilus /path/to/file.txt

아이디어나는 사용할 수 있다

xdg-mime query default inode/directory

기본 파일 관리자를 가져옵니다(노틸러스의 경우) 위에 표시된 대로 호출합니다. 그러나 노틸러스가 내 시스템의 기본값임에도 불구하고( xdg-open그놈 쉘에서 노틸러스 및 위치 메뉴 열기) xdg-mime가 반환됩니다 Thunar.desktop(시도했지만 find / -name Thunar.desktop -mount 2>/dev/null아무것도 찾지 못했습니다.)

또한 디렉터리를 열고 하위 디렉터리를 선택하는 방법을 모르겠습니다.목차노틸러스에서(위의 방법을 사용하여 하위 디렉터리를 엽니다).

기본 파일 관리자에서 디렉토리를 여는 방법그리고해당 디렉토리에서 파일을 선택하십시오(디렉토리도 선택할 수 있으면 좋지만 이 응용 프로그램에는 필요하지 않습니다). 아니면 직접 호출할 수 있도록 최소한 기본 파일 관리자를 알아내시겠습니까?

답변1

1.노틸러스에서 디렉토리를 열고 하위 디렉토리/파일을 선택하려면:

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

~에서nautilus(1) 매뉴얼 페이지:

-s, --선택
  상위 폴더에 지정된 URI를 선택합니다.

2. xdg-mime돌아왔지만 Thunar.desktop열려 xdg-open있다nautilus

xdg-mimemimeapps.list사용할 기본 애플리케이션을 결정 하는 데 사용됩니다 .

mimeapps.list사용자별, 시스템별, 배포별 요구 사항을 처리하기 위해 별도의 파일이 존재합니다. 검색 순서는 다음에서 찾을 수 있습니다.여기.

mimeapps.list지정된 MIME 유형에 대한 기본 응용 프로그램은 [기본 응용 프로그램] 섹션에 나열됩니다. 여러 기본 애플리케이션을 우선순위 내림차순으로 나열할 수 있습니다. 예를 들어:

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

어디모방 유형 1무언극 형식이고*. 데스크탑데스크탑 파일입니다.

xdg-open유효한 데스크탑 파일을 찾을 때까지 환경설정 목록에서 찾은 순서대로 데스크탑 파일을 검색합니다. 모든 파일 중에서 해당 파일이 발견되지 않으면 연관에 따라 가장 선호하는 파일이 선택되어 기본 응용 프로그램으로 사용됩니다.

default1.desktop따라서 이 예에서는 시스템에 존재하지 않는다고 가정하므로 xdg-open시도됩니다 default2.desktop. 그러나 xdg-mime반환되는 것은 파일의 첫 번째 항목 default1.desktop입니다 .mimeapps.list

귀하의 경우에는 출력 default1.desktop이어야 합니다 . Thunar.desktop하지만 시스템에 설치되어 있지 않습니다. 따라서 시스템에 있는 파일/디렉토리를 사용하여 xdg-open파일/디렉토리를 엽니다 . 이를 확인하려면 파일에 가 포함되어 있는지 nautilus확인할 수 있습니다 . Ubuntu 17.10의 경우 파일 위치는 다음과 같습니다.mimeapps.listinode/directorymimeapps.list/usr/share/applications/defaults.list

노트:"기본 앱"을 결정하는 전체 알고리즘을 찾을 수 있습니다.여기.

답변2

dbus가 빠르게 인기를 얻고 있으므로 파일을 열려면 dbus를 사용하는 것이 좋습니다.

"기본" 파일 관리자의 개념은 집중하는 경우에만 실제로 존재 xdg-mime하지만 dbus 세계(실제로 대부분의 응용 프로그램)에서는 상황이 다르며 "기본" 파일 관리자의 개념은 더 이상 존재하지 않습니다.

/home/me/path/to/folder/or/filedbus를 사용하여 (기본?) 파일 관리자에서 파일()을 여는 방법은 다음과 같습니다.

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:""

이 명령이 하는 일은 org.freedesktop.FileManager1이 인터페이스를 구현하는 dbus 서비스를 찾아 열려고 하는 파일의 경로로 호출하는 것입니다.

뒤에 물음표를 붙인 이유기본dbus는 "기본" 파일 관리자의 개념을 존중하지 않기 때문에 해당 인터페이스를 구현하는 첫 번째 서비스에 호출을 보내고 작업을 처리하도록 하는 것뿐입니다. 이제 선택한 앱이 "기본" 파일 관리자가 될 수 있지만 항상 보장되는 것은 아닙니다.

대부분의 최신 애플리케이션은 dbus이를 기본값으로 설정하고 xdg-mimedbus 호출이 실패하면 대체되므로 이 방법을 권장합니다.


여러 파일 선택

파일 이름 사이에 쉼표를 추가하면 됩니다.

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:""

dbus에서 사용하는 파일 관리자에 따라 여러 파일을 열 때 다른 동작이 발생할 수 있습니다.일부사용자들은 Thunar가 선택한 각 파일에 대해 새 창(또는 새 탭)을 연다고 불평합니다.

답변3

@smac89, 귀하의 문자열을 사용하여 AWK 스크립트를 작성하고 이를 ~/.local/bin/xdg-select-file공개 디렉토리에 저장한 다음 GIO 바이너리를 사용하여 모든 경로/URI에 대한 파일을 선택하여 URI를 얻었습니다. 이 스크립트의 구문은 다음과 같습니다.

xdg-select-file /full/path/file

또는:

xdg-select-file ../relative/path/file

또는:

xdg-select-file file:///URI%20TO/path/file

파일 경로에 작은따옴표나 큰따옴표를 사용할 수 있습니다.

코드는 다음과 같습니다.

#!/usr/bin/awk -f
BEGIN{
    for(i=1;i<ARGC;i++){
        xdg_select_file(ARGV[i])
    }
}

function xdg_select_file(infile,    cmd_get,cmd_run){
    cmd_get="LC_MESSAGES=C gio info " infile
    while((cmd_get|getline)>0){
        if($1~/^uri:/){
        cmd_run="dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:\""$2"\" string:\"\""
        break
        }
    }
    system(cmd_run)
    close(cmd_run)
}

답변4

이론적으로 파일 및 디렉터리에 대해 다음 작업을 수행할 수 있어야 합니다.

#!/bin/bash
# Copyright 2024 Mikko Rantalainen <[email protected]>
# License: MIT <https://opensource.org/license/mit/>
set -e

urlencode()
{
    printf "%s" "$@" | perl -pe 's/([^A-Za-z0-9.\/:])/sprintf("%%%02X", ord($1))/seg'
}

if test -z "$1"; then
    exec xdg-open .
fi

PREFIX=""
FILES=""
for f in "$@"; do
    abs="$(realpath -e "$f")"
    ef="$(urlencode "$abs")"
    bef="$(printf "file://%q" "$ef")"
    FILES="$FILES$PREFIX$bef"
    PREFIX=","
done

dbus-send --session --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:$FILES string:''

그러나 실제로 이는 하나의 파일에 대해서만 작동하며 대상은 의도한 파일 관리자일 수도 있고 아닐 수도 있습니다. --dest둘 이상이 이 인터페이스를 구현하는 경우 원하는 파일 관리자와 일치하도록 변경할 수 있습니다 org.freedesktop.FileManager1. 예를 들어 Caja를 사용하는 경우 --dest=org.mate.Caja대신 사용할 수 있습니다 . 가능한 대상 이름을 나열하거나 --dest=org.freedesktop.FileManager1시도할 수 있습니다 .busctlqdbus

여러 파일을 전달할 때 파일 관리자가 단일 창에서 여러 파일을 선택하도록 하고 싶습니다. 내 시스템에서는 Caja와 Thunar만이 이 API를 구현하는 것으로 보이며 둘 다 동일한 수의 창을 열고 각 창에 대해 파일을 선택하여 여러 파일을 구현합니다. 단일 파일이나 디렉터리의 경우 파일 관리자 창을 열고 지정된 파일이나 디렉터리를 미리 선택하는 예상 동작이 발생합니다.

이 스크립트를 인수 없이 호출하면 xdg-open.

관련 정보