Tại sao đây là một câu hỏi đầy thách thức
Câu hỏi có một vài thách thức:
nautilus
không giao tiếp trực tiếp từ dòng lệnh, ví dụ để lấy thư mục đang hoạt động, bạn cũng không thể "gửi" thư mục hiện đang mở (-window) đến thư mục khác từ dòng lệnh.
- Trong đường dẫn hiện tại, như được yêu cầu thông qua
"NAUTILUS_SCRIPT_CURRENT_URI"
, Nautilus không trả lại đường dẫn thực cho thư mục hiện tại, nhưng "nhìn thấy" liên kết như thể đó là một thư mục thực tế.
Do đó, giải pháp là bẩn như nó được; chúng ta cần tìm cách giải quyết. Dưới đây bốn lựa chọn để giải quyết vấn đề.
1. nhấp chuột phải để tăng một cấp
Để có được đường dẫn thực sự đến thư mục hiện tại, chúng ta phải lấy thông tin từ liên kết. Chúng tôi có thể làm điều đó bằng cách sử dụng ls -l
trên liên kết, sẽ xuất ra, ví dụ:
lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current
trong đó phần sau ->
là đường dẫn thực bên trong symlink, hoặc, sử dụng python
:
real = os.path.realpath("/path")
Sử dụng điều này trong một nautilus
kịch bản, chúng ta có thể gián tiếp có được thực tế đường dẫn đến tệp hoặc thư mục hiện tại.
Sau đó, nếu chúng ta có đường dẫn, làm thế nào để làm cho nautilus di chuyển lên một cấp?
Một lần nữa, chúng ta không thể giải quyết điều này và giữ cho bàn tay của chúng ta sạch sẽ. Để di chuyển lên một cấp, trước tiên chúng tôi chỉnh sửa đường dẫn tìm thấy một chút, từ:
/path/to/a/folder
vào
/path/to/a
sau đó, sử dụng xdotool
để mô phỏng Ctrl+ L(phím tắt GUI để chèn một đường dẫn vào cửa sổ nautilus, vì không có tùy chọn cli để di chuyển đến thư mục khác bằng cửa sổ hiện tại ) và sau đó thực hiện xclip
dán đường dẫn đã chỉnh sửa +Enter , chúng tôi có một giải pháp làm việc !
Trong thực tế
Chúng tôi đang ở trong một thư mục, được mở từ một liên kết ("Liên kết đến Telegram") trên Màn hình của tôi. Các thực thư mục là một thư mục con của tôi Downloads
thư mục:
Sau đó, nếu chúng ta nhấp chuột phải vào bất kỳ tệp nào trong thư mục để chạy tập lệnh:
Tự động, đường dẫn đến thư mục ưu việt được chèn vào:
Và, cũng tự động, Returnđược nhấn và chúng tôi di chuyển một cấp thư mục lên:
Kịch bản
#!/usr/bin/env python3
import subprocess
import os
import time
def run(cmd):
subprocess.call(["/bin/bash", "-c", cmd])
current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
real = os.path.realpath(current)
up = os.path.abspath(os.path.join(real, os.pardir))
run("xdotool key Control_L+l")
run("printf '"+up+"' | xclip -selection clipboard")
run("xdotool key Control_L+v")
# confirm by virtually press Return
time.sleep(0.1)
run("xdotool key Return")
Làm thế nào để thiết lập
Kịch bản cần cả hai xdotool
và xclip
:
sudo apt-get install xdotool xclip
tạo, nếu nó chưa tồn tại, thư mục
~/.local/share/nautilus/scripts
Sao chép tập lệnh ở trên vào một tệp trống, lưu nó dưới dạng level_up
(không có phần mở rộng) ~/.local/share/nautilus/scripts
và làm cho nó có thể thực thi được
- Bạn có thể phải đăng xuất và đăng nhập lại.
Bây giờ bạn sẽ có thể chạy tập lệnh bằng cách nhấp chuột phải vào tệp (bất kỳ)> tập lệnh> level_up:
[ EDIT ] Tôi đã thay đổi tập lệnh ở trên để dán đường dẫn vào nautilus
cửa sổ, thay vì tạo xdotool
kiểu . Nó needs
xclip
được cài đặt, nhưng nó là một cải tiến lớn, đặc biệt là trên những con đường rất dài.
2. Hoặc, mở một cửa sổ nautilus mới trong thư mục ưu việt
Bạn có thể tránh sử dụng xdotool
, bằng cách làm cho tập lệnh mở một cửa sổ nautilus mới , trong thư mục của cha mẹ. Kịch bản sau đó sẽ còn ngắn hơn:
#!/usr/bin/env python3
import subprocess
import os
def run(cmd):
subprocess.call(cmd)
current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
real = os.path.realpath(current)
up = real[:real.rfind("/")]
subprocess.Popen(["nautilus", up])
Trong trường hợp này, bạn sẽ không cần phải cài đặt xdotool
. Chúng tôi thậm chí có thể mở rộng tập lệnh bằng cách đóng cửa sổ gốc và đặt cửa sổ mới chính xác ở cùng một vị trí (& kích thước).
Nhược điểm là lịch sử của cửa sổ ban đầu bị mất theo cách này.
3. Một giải pháp bổ sung: cách khác để (tự động) tạo liên kết
Không liên quan đến các liên kết hiện có, nhưng khi được sử dụng từ GUI, tập lệnh nautilus để tự động tạo tệp thực thi .desktop
tệp khi nhấp chuột phải có thể hữu ích:
nhấp chuột phải vào thư mục để tạo lối tắt (hoạt động như một liên kết)
Không giống như các liên kết tượng trưng, các liên kết này sẽ đưa bạn đến thư mục thực tế, mà không hoạt động như chính thư mục:
Kịch bản
#!/usr/bin/env python3
import subprocess
import os
current = os.getenv(
"NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
).replace("file://", "").replace("%20", " ").strip()
if os.path.isdir(current):
parent = os.path.abspath(os.path.join(current, os.pardir))
fldr_path = '"'+current+'"'
folder = current[current.rfind("/")+1:]
linkfilename = parent+"/"+folder+"link.desktop"
linkdata = [
"[Desktop Entry]",
"Type=Application",
"Name=Link to -> "+folder,
"Icon=folder",
"Exec=nautilus "+fldr_path,
]
with open(linkfilename, "wt") as wt:
for l in linkdata:
wt.write(l+"\n")
command = "chmod +x "+"'"+linkfilename+"'"
subprocess.Popen(["/bin/bash", "-c", command])
Cách sử dụng
- Sao chép tập lệnh vào một tệp trống, lưu nó dưới dạng
make_link
(không có phần mở rộng) ~/.local/share/nautilus/scripts
và làm cho nó có thể thực thi được
- Sử dụng tập lệnh bằng cách chọn nó làm tùy chọn nhấp chuột phải như trong hình ảnh đầu tiên. Một
.desktop
tập tin thực thi sẽ được tạo trong cùng thư mục, di chuyển nó đi nơi khác nếu bạn cần; đường dẫn liên kết là tuyệt đối.
Cung cấp cho liên kết một biểu tượng phân biệt
Bạn có thể cung cấp cho các liên kết thay thế một biểu tượng phân biệt. Nếu bạn tìm kiếm trong /usr/share/icons
thư mục "thư mục", nhiều tùy chọn hợp lệ sẽ bật lên.
Nếu trong tập lệnh, dòng "Icon=folder",
được thay thế bằng Icon=stock_folder-copy,
(sử dụng tên biểu tượng không có phần mở rộng), kết quả trên hệ thống của tôi là:
Tất nhiên bạn cũng có thể sử dụng biểu tượng tùy chỉnh của riêng mình, nhưng nếu bạn sử dụng đường dẫn đầy đủ (không sử dụng ~
), bạn nên bao gồm phần mở rộng của biểu tượng.
4. Di chuyển đến thư mục ưu việt với phím tắt
Có lẽ là lựa chọn thuận tiện nhất; với cửa sổ nautilus ở phía trước, nhấn phím cắt ngắn để di chuyển một thư mục lên.
Kịch bản
#!/usr/bin/env python3
import subprocess
import time
import os
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
def run(cmd):
subprocess.call(["/bin/bash", "-c", cmd])
# get information on the active window
front = get(["xprop", "-id", get(["xdotool", "getactivewindow"])])
# (only) if it is a "normal" nautilus window, take action
if 'WM_CLASS(STRING) = "nautilus", "Nautilus"' in front:
# "virtually" press Ctrl + l
run("xdotool key Control_L+l"); time.sleep(0.05)
# copy the current path, calculate the "real" parent directory
real = os.path.realpath(get(["xclip", "-o"]))
up = os.path.abspath(os.path.join(real, os.pardir))
time.sleep(0.1)
# enter the superior directory
run("printf '"+up+"' | xclip -selection clipboard")
run("xdotool key Control_L+v")
# confirm by virtually press Return
time.sleep(0.1)
run("xdotool key Return")
Để sử dụng
Đối với giải pháp này, cả xclip
và xdotool
Cần phải có trên hệ thống của bạn.
sudo apt-get install xdodool xclip
Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng level_up.py
(bất cứ nơi nào).
Thêm nó vào một phím tắt: chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:
python3 /path/to/level_up.py
NB Các tùy chọn phím tắt bị giới hạn một chút trong trường hợp này, vì chính tập lệnhsẽ mô phỏngCtrl+LvàCtrl+Alt+Lsẽ khiến bạn đăng xuất ...Ctrl+\ hoạt động tốt trên hệ thống của tôi.
Giải trình
Kịch bản này cũng mô phỏng Ctrl+ L, nhưng thay vì sử dụng nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI"
, nó sử dụng xclip
để sao chép đường dẫn được chọn tự động trong cửa sổ nautilus. Giống như tùy chọn 1, tập lệnh sau đó tính toán đường dẫn thực và lấy thư mục cấp trên.
Tùy chọn này có thể hữu ích nếu bạn thích bàn phím sử dụng nhấp chuột phải.