就像标题一样。在 Windows 上,我可以这样做:
explorer /select,"C:\folder\file.txt"
这将导致打开explorer.exe
,将立即打开C:\folder
并选择file.txt
。
我相信ROX也有这个功能。
我可以用 thunar 做同样的事情吗?
答案1
根据 的答案theY4Kman
,这是不使用 Python 的方法:
dbus-send --type=method_call --dest=org.xfce.Thunar /org/xfce/FileManager org.xfce.FileManager.DisplayFolderAndSelect string:"/home/user/Downloads" string:"File.txt" string:"" string:""
唯一需要注意的是,您需要将文件夹路径和文件名分开。
答案2
经过一番挖掘,我发现使用 D-Bus 可以做到这一点:
#!/usr/bin/env python
import dbus
import os
import sys
import urlparse
import urllib
bus = dbus.SessionBus()
obj = bus.get_object('org.xfce.Thunar', '/org/xfce/FileManager')
iface = dbus.Interface(obj, 'org.xfce.FileManager')
_thunar_display_folder = iface.get_dbus_method('DisplayFolder')
_thunar_display_folder_and_select = iface.get_dbus_method('DisplayFolderAndSelect')
def display_folder(uri, display='', startup_id=''):
_thunar_display_folder(uri, display, startup_id)
def display_folder_and_select(uri, filename, display='', startup_id=''):
_thunar_display_folder_and_select(uri, filename, display, startup_id)
def path_to_url(path):
return urlparse.urljoin('file:', urllib.pathname2url(path))
def url_to_path(url):
return urlparse.urlparse(url).path
def main(args):
path = args[1] # May be a path (from cmdline) or a file:// URL (from OS)
path = url_to_path(path)
path = os.path.realpath(path)
url = path_to_url(path)
if os.path.isfile(path):
dirname = os.path.dirname(url)
filename = os.path.basename(url)
display_folder_and_select(dirname, filename)
else:
display_folder(url)
if __name__ == '__main__':
main(sys.argv)
执行:
$ ./thunar-open-file.py /home/user/myfile.txt
如果你通过的话,它仍然会打开一个文件夹:
$ ./thunar-open-file.py /home/user/
答案3
使用 thunar 的内置命令行开关,您就不能这样做。如果您看到man thunar
,您会发现您只能以这种方式打开文件夹,但无法在其中预选文件。
是不是意味着你根本做不到?
幸运的是不是,但您需要外部程序的帮助。使用以下方法完成此操作的示例xdo工具发送ctrl+s
并输入filename
(这将有效地选择它):
#!/bin/sh
file=$1
[ -z "$file" ]; then
echo 'No file selected' 1>&2
exit 1
fi
if [[ ! $(command -v thunar) ]]; then
echo 'Thunar is not installed' 1>&2
exit 1
fi
if [ -d "$file" ]; then
thunar "$file" &
else
if [ ! -f "$file" ]; then
echo 'File does not exist' 1>&2
exit 1
fi
if [[ ! $(command -v xdotool) ]]; then
echo 'Xdotool is not installed' 1>&2
exit 1
fi
set -e #exit on any error
thunar "$(dirname "$file")" &
window_id=`xdotool search --sync --onlyvisible --class 'Thunar' | head -n1`
xdotool key --clearmodifiers 'ctrl+s'
xdotool type "$(basename "$file")"
xdotool key Return
fi
用法:script /path/to/file-or-folder
有两个注意事项:
- 您会注意到由于 而导致的轻微滞后
xdotool --sync
,但我认为这是可以接受的。 - 这不适用于出于任何原因隐藏在 thunar 中的文件,例如点文件。