Nautilus: Symlink aracılığıyla dizin ziyaret etti, şimdi hedef dizin hiyerarşisinde bir seviye yukarı çıkamıyorum


14

"Bağlantı oluştur" seçeneği ile bir kısayol oluşturdum. Bu kısayolun klasörüne girdiğimde üzerinde herhangi bir klasör göremiyorum, bu yüzden onlara kolayca gidemiyorum.

GUI'de bir klasör yukarı gitmenin bir yolu var mı? Belki bir kısayol tuşu? ( cd ..Bu sefer yapamam ^ __ ^).

resim açıklamasını buraya girin


Örneğin Windows'ta gerçekten de tarif ettiğim şekilde gezinebiliyorum, işte bunu açıklayan bir Win10 görüntüsü:

resim açıklamasını buraya girin


Geri tuşunu denediniz mi?
PenguinCSC

O kaynağı ile yapılmalıdır olsa Nautilus araç çubuğuna bir ebeveyn düğmesi eklemek kolaydır Nautilus az 3.16 den> (yama veya mevcut 14.04 için bir ppa yapı) yeniden yılında Aksi deneyinAlt+up key
Doug

Alt + Up beni bağlantının hedefinden masaüstüne getiriyor ... Ne yazık ki hayır: \ Buradaki birinin doğru bağlantıları varsa, bunu doğrudan geliştirme ekibine sunabilir mi? Çok
yeniyim

Ah - Ne demek istediğini anlıyorum. Belki Jacob'un çözümünü deneyin ya da kendiniz bağlantılar oluşturun. Geçerli bağlantılarınız bir dizin olarak görülür, bu nedenle yukarı dir. bağlantı, genellikle Masaüstünde. Yürütülebilir bir .desktop dosyası kullanarak bağlantılar oluşturursanız, bu 'bağlantı'yı kullandıktan sonra gezinme normal olacaktır.
Doug

Burada aynı soru askubuntu.com/questions/713397/show-full-path-for-links (çözülmüşse, diğerini kopya olarak işaretlemek için)
user.dz

Yanıtlar:


17

Bu neden zor bir soru?

Sorunun birkaç zorluğu var:

  • nautilus o anda etkin olan dizini almak için doğrudan komut satırından iletişim kurmaz ve o anda açık olan klasörü (-window) komut satırından başka bir dizine "gönderemezsiniz".
  • Geçerli yolda, üzerinden istendiği gibi "NAUTILUS_SCRIPT_CURRENT_URI", Nautilus gerçek yolu geçerli klasöre döndürmez , ancak bağlantıyı gerçek bir klasör gibi "görür".

Bu nedenle çözüm elde ettiği kadar kirli; geçici çözümler bulmamız gerekiyor. Sorunu çözmek için dört seçeneğin altında.

1. bir seviye yukarı gitmek için sağ tıklayın

Almak için gerçek geçerli dizine yolunu biz bağlantısından bilgi almak zorundayız. Bunu, ls -lörneğin aşağıdaki gibi çıkacak olan bağlantıyı kullanarak yapabiliriz :

lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current

nerede bölüm sonra ->ise gerçek kullanarak, sembolik bağ içindeki yolu veya python:

real = os.path.realpath("/path")

Bunu bir nautiluskomut dosyasında kullanarak , geçerli dosya veya klasöre giden gerçek yolu dolaylı olarak alabiliriz .

O zaman yolumuz varsa, nautilus'un bir seviye yukarı hareket etmesini nasıl sağlayabiliriz?

Yine, bunu çözemeyiz ve ellerimizi temiz tutamayız. Bir seviye yukarı gitmek için önce bulunan yolu biraz düzenleriz:

/path/to/a/folder

içine

/path/to/a

sonra, + ( mevcut bir pencereyi kullanarak başka bir dizine geçmek için cli seçeneği olmadığından, nautilus penceresine yol eklemek için GUI kısayolu) xdotoolsimüle etmek ve daha sonra düzenlenmiş yolu + yapıştırmak için kullanarak, çalışan bir çözümümüz var !CtrlLxclipEnter

Uygulamada

  1. Masaüstümdeki bir bağlantıdan ("Telegram Bağlantısı") açılan bir klasördeyiz. Gerçek klasör benim bir alt klasör Downloadsklasöründe:

    resim açıklamasını buraya girin

  2. Sonra komut dosyasını çalıştırmak için klasör içindeki dosyalardan herhangi birine sağ tıklarsak :

    resim açıklamasını buraya girin

  3. Otomatik olarak, üstün dizinin yolu eklenir:

    resim açıklamasını buraya girin

  4. Ayrıca otomatik olarak Returnda basılır ve bir dizin düzeyi yukarı taşınırız:

    resim açıklamasını buraya girin

Senaryo

#!/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")

Nasıl kurulur

  1. Senaryo hem ihtiyacı xdotoolve xclip:

    sudo apt-get install xdotool xclip
    
  2. oluşturma, zaten yoksa, dizin

    ~/.local/share/nautilus/scripts
    
  3. Yukarıdaki komut dosyasını boş bir dosyaya kopyalayın, içine level_up(uzantı yok) kaydedin ~/.local/share/nautilus/scriptsve yürütülebilir yapın

  4. Oturumu kapatıp tekrar açmanız gerekebilir.
  5. Artık bir dosyayı (herhangi bir)> komut dosyalarını> level_up sağ tıklayarak komut dosyasını çalıştırabilmelisiniz :

    resim açıklamasını buraya girin


[ EDIT ] Ben yukarıdaki senaryoyu değiştirdi yapıştırın içine yolunu nautilusyerine yapma, pencerenin xdotool türünü o. Bu needs xclipyükledim, ancak özellikle çok uzun yollarda, büyük bir geliştirme edilecek.


2. Alternatif olarak, üst dizinde yeni bir nautilus penceresi açın

Sen olabilir kullanmaktan kaçınmak xdotoolkomut dosyası açmak yaparak, yeni ebeveynin dizinde Nautilusun pencere. Komut dosyası daha da kısa olacaktır:

#!/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])

Bu durumda, yüklemenize gerek yoktur xdotool. Orijinal pencereyi kapatarak ve yeni pencereyi tam olarak aynı konuma (& boyut) yerleştirerek komut dosyasını genişletebiliriz.

Dezavantajı, orijinal pencerenin tarihinin bu şekilde kaybolmasıdır.

3. Ek bir çözüm: (otomatik olarak) bağlantı oluşturmanın alternatif yolu

Mevcut bağlantılar ile ilgili değildir, ancak GUI'den kullanıldığında .desktop, sağ tıklamayla otomatik olarak yürütülebilir dosyalar oluşturmak için bir nautilus betiği yardımcı olabilir:

kısayol oluşturmak için dizine sağ tıklayın (bağlantı olarak davranma)

resim açıklamasını buraya girin

Sembolik bağlantıların aksine, bu bağlantılar sizi bir klasör gibi davranmadan gerçek klasöre götürür:

resim açıklamasını buraya girin

Senaryo

#!/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])

Nasıl kullanılır

  1. Komut dosyasını boş bir dosyaya kopyalayın, make_link(uzantı yok) olarak kaydedin ~/.local/share/nautilus/scriptsve yürütülebilir yapın
  2. Komut dosyasını, ilk görüntüdeki gibi sağ tıklama seçeneği olarak seçerek kullanın. .desktopAynı dizinde yürütülebilir bir dosya oluşturulur, gerekirse başka bir yere taşıyın; bağlı yol mutlaktır.

Bağlantıya ayırt edici bir simge verin

Alternatif bağlantıya ayırt edici bir simge verebilirsiniz. Dizinde /usr/share/icons"klasör" için arama yaparsanız , çok sayıda geçerli seçenek açılır.

Komut dosyasında satır "Icon=folder",değiştirilirse Icon=stock_folder-copy,(uzantı olmadan simge adını kullanın), sistemimdeki sonuç:

resim açıklamasını buraya girin

Elbette kendi özel simgenizi de kullanabilirsiniz, ancak tam yollar kullanıyorsanız (kullanmayın ~), simgenin uzantısını eklemeniz gerekir .

4. Kısayol tuşuyla üst dizine gidin

Muhtemelen en uygun seçenek; nautilus penceresi önde, bir dizini yukarı taşımak için bir kısayol tuşuna basın.

Senaryo

#!/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")

Kullanmak

  1. Bu çözüm için, hem xclipve xdotoolİhtiyaç sisteminizde olması.

    sudo apt-get install xdodool xclip
    
  2. Komut dosyasını boş bir dosyaya kopyalayın, level_up.py(her yerde) olarak kaydedin .

  3. Bir kısayol tuşuna ekleyin: şunu seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:

    python3 /path/to/level_up.py
    

Not : Bu durumda kısayol seçenekleri biraz sınırlıdır, çünkü betiğin kendisiCtrl +simüle ederLveCtrl+Alt+Loturumunuzu kapatır ...Ctrl+\sistemimde iyi çalıştı.

açıklama

Bu komut dosyası ayrıca Ctrl+ simüle eder L, ancak nautilus 'kullanmak yerine , nautilus penceresinde otomatik olarak seçilen yolu kopyalamak için "NAUTILUS_SCRIPT_CURRENT_URI"kullanır xclip. Seçenek 1 gibi, komut dosyası da gerçek yolu hesaplar ve üstün dizini türetir.

Bu seçenek, klavyenin sağ tıklamayı kullanmasını tercih ediyorsanız faydalı olabilir.


3

Veya xdotoolpaket eklendiğinde Ubuntu 14.04, nautilus 3.10-1 için .local/share/nautilus/scripts/updirtree dosyanızda aşağıdakileri kullanmanız yeterlidir :

# In nautilus, the pwd is the actual, not the link path
xdotool key ctrl-l
xdotool type "$(dirname $(pwd))" "
"

Son alıntı sadece yeni satır veya dönüş ( 0x0a) içermelidir . pwdİçinden Nautilus bir bash / terminal den çalıştırdığınızda daha farklı bir sonuç üretir - bu gerçek yolu değil, bağlantıyı kullanarak yolu döndürür.


Hiçbir anlam ifade etmiyor, belgelenmemiş ve hatta yürütme ortamının kodu çalıştırdığını bile anlayamıyorum (bu sonucu üreten herhangi bir kabuk bulamıyorum), ama işe yarıyor. Bu bir hack, bu yüzden nautilus sürümünü ekledim. Ne kadar süre çalışacağını kim bilebilir? Bir sonraki nautilus yükseltmesinde (veya bilinmeyen yorumlayıcıda) kesilebilir, ancak benim için, bağlı konumlara bağlantılar, dizin ağacındaki yerlere bağlantılar veya dizin ağacındaki düz konumlar üzerinde çalışır.


Ubuntu 15.10 kullanıyorum ... Belki benzer bir kodda çalışabilir mi?
JohnDoea

1
Bu hiç mantıklı değil $(pwd), kabuğun çalışma dizini , nautilus değil . Bkz help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm

@benos Onaylıyorum, 15.10'da çalışıyor
user.dz

@JacobVlijm, İyi çalışıyor, bana makul görünüyor, nautilus geçerli dizinde komut dosyaları çalıştırıyor.
user.dz

1
Ayrıca @Sneetsher benim için sürpriz, işe yarıyor. Ancak çok uzun yollarda kullanıldığında bir zamanlama sorununuz var. Yolun uzunluğuna bağlı olarak bir mola vermeniz gerekir. Başka yazılan yollar bozuk görünüyor. İlk başta, (keyfi) bir mola ile düzelttim, En son sürümde, yolun uzunluğuna tabi olmayan yolu xclip yapıştırdım .
Jacob Vlijm

2

Temiz bir düzeltme, ancak bu taahhüdü geri alarak kaynağın yeniden yapılandırılması gerekiyor :

diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c
index ca1f0ac..0b363b4 100644
--- a/src/nautilus-mime-actions.c
+++ b/src/nautilus-mime-actions.c
@@ -2029,21 +2029,13 @@ activate_activation_uris_ready_callback (GList *files_ignore,

    /* Convert the files to the actual activation uri files */
    for (l = parameters->locations; l != NULL; l = l->next) {
-       char *uri = NULL;
-
+       char *uri;
        location = l->data;

        /* We want the file for the activation URI since we care
         * about the attributes for that, not for the original file.
         */
-       if (nautilus_file_is_symbolic_link (location->file)) {
-           uri = nautilus_file_get_symbolic_link_target_uri (location->file);
-       }
-
-       if (uri == NULL) {
-           uri = nautilus_file_get_activation_uri (location->file);
-       }
-
+       uri = nautilus_file_get_activation_uri (location->file);
        if (uri != NULL) {
            launch_location_update_from_uri (location, uri);
        }

Derleme talimatları:

  1. İndirme kaynağı:

    apt-get source nautilus
    
  2. Derleme bağımlılıklarını indir

    sudo apt-get build-dep nautilus
    
  3. Yukarıdaki yamadan ihtiyaç duyulan değişikliği yapın

    Düzenle src/nautilus-mime-actions.c

    /* Convert the files to the actual activation uri files */
    for (l = parameters->locations; l != NULL; l = l->next) {
        char *uri = NULL;
        location = l->data;
    
        /* We want the file for the activation URI since we care
         * about the attributes for that, not for the original file.
         */
        if (nautilus_file_is_symbolic_link (location->file)) {
            uri = nautilus_file_get_symbolic_link_target_uri (location->file);
        }
    
        if (uri == NULL) {
            uri = nautilus_file_get_activation_uri (location->file);
        }
    
        if (uri != NULL) {
            launch_location_update_from_uri (location, uri);
        }
    
  4. Oluşturun ve yükleyin

    autoreconf
    ./configure
    make
    

    Kurulum yapmadan test etmek için

    sudo killall -r "[\w]*nautilus"
    ./src/nautilus
    

    Yüklemek için

    sudo make install
    

Bu, nautilus'un hedef yolundaki bağlantıları çözmesini sağlayacaktır. BTW, bu bir süre önce hata olarak bildirildi. Bunun bir özellik olduğunu düşünüyorsanız, bunun için anahtar veya belirli bir kısayol ayarlamasını isteyen başka bir hata raporu gönderin.

Referans: Nautilus'un kayıt dışı bırakma simgelerini nasıl durdurabilirim? [kapalı]


Sorun, nautilus'un geçerli sürümünü sabitlemeniz veya her güncellemeden sonra prosedürü tekrarlamanız olabilir.
Jacob Vlijm

1
@JacobVlijm, evet eğer deb paketini oluşturursam öyle olacak. Ama, bu kurulacak vermedi /usr/local/bin/sistem her zaman değiştirilmiş kopyasını koşmak öyle listelendiği gibi,$PATH
user.dz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.