Seçilen dosya yolunu almak ve yunus KDE'sinde kopyalamak ve zsh'ye yapıştırmak nasıl?


0
  ~ cat .zshrc | grep xclip
alias c="xclip -selection c"
alias -g v='"$(xclip -selection c -o)"'
  ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png
  ~ 

"" 那个 文件 或 目录 "Çince sözcükleri" dosya veya dizin yok "anlamına gelir.

Bulunan bir dosyayı kopyalamak istiyorum /home/roach/Downloads/pure.png. Yunus KDE'de seçtikten ve kopyaladıktan sonra (farenin sağ tuşuna tıklayın, sonra kopyalayıp tıklayın), yukarıda gösterilenden /home/roach/Downloads/pure.pngçok bir yol var file:///home/roach/Downloads/pure.pngmı?

Ve sanırım sedfazladan file://karakterleri silmek gibi komut kullanmak , ancak doğru yöntemi alamadım.

  ~ alias -g v='"$(xclip -selection c -o)|sed -e 's/file:\/\///'"'
  ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png|sed -e s/file:////
  ~ 

Peki, nasıl düzeltebilirim alias -g v?

Yanıtlar:


1

Kabuğun kendisi, daha pahalı çatallardan kaçınarak harici bir programın çalıştırılmasını önleyerek bu değişikliği yapabilir. Ayrıntılar için "Parametre genişletme" bölümüne bakın zshexpn(1).

% x=file:///etc/passswd; print ${x#file://}
/etc/passswd

Yani senin durumunda belki bir şey gibi

% alias -g v='${$(xclip -selection c -o)#file://}'
% print -l v
/etc/passswd

Bunun vbir miktar ortak mektup olduğuna dikkat edin , bu nedenle küresel bir takma ad olarak uygun olmayabilir.

Ayrıca addaki boşlukların nasıl işlendiğine karar vermek de isteyebilirsiniz; print -larasındaki farkı ortaya çıkaracaktır:

alias -g v='${$(xclip -selection c -o)#file://}'
alias -g v='${"$(xclip -selection c -o)"#file://}'

pano içeriğinde boşluklar olduğunda.


Bu harika! Teşekkürler! Biraz derin sorabilir miyim? Boşluk içeren bir dir veya dosyaya sahip lsolduğumda, termianl komutunu çalıştırdığımda , başlangıç ​​ve bitiş gibi tek bir alıntı gösterecektir 'abc wasd'. Ve şimdi 'abc wasd'panoya kopyaladıktan sonra , nasıl çalıştırabilirim? Yanıtınızı, unix.stackexchange.com/a/104887/232089’dan sonra alias -gv = '$ {"$ (xclip -selection c -o)" // \ "#dosya: //}' olarak değiştirdim . işe yaramadı
roachsinai

Şu an tek istediğim bir direktör seçilip, yunusun bir kopyasını yapıp lstüm işleri tek bir alıntı ile çevrili olacak bir zsh ile bir direkte kopyalamak .
roachsinai

1
muhtemelen istiyorum ${${(Q)"$(xclip -selection c -o)"}#file://}alıntı biri düzeye çıkarmak
thrig

Merhaba, @thrig Çok teşekkürler! Hem öndeki hem de sondaki boşlukları kaldırmaksed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' istediğimle nasıl birleştireceğimi lütfen bana tekrar yardımcı olabilir misiniz ?
roachsinai

1

Bildiğiniz gibi, takma ad

alias -g v='"$(xclip -selection c -o)"'

Çağrıldığında v, kabuğun pano içeriği olarak adlandırılan bir komutu çalıştırmaya çalıştığı anlamına gelir . İlk kod parçanızda olan budur. Bununla birlikte, vetkilerini çağırmak ve gözlemlemek yanıltıcıdır, çünkü bu küresel takma ad için amaçlanan kullanım , diğer komutların argümanı olmaktır.

Kişisel seddüzgün komut ikamesi (kullanırsanız tabanlı çözüm çalışacak $(...)) ve alıntı:

alias -g v='$(xclip -selection clipboard -o | sed '"'"'s|^file://||'"'"')'

Burada, xclippanonun içeriğini sed, file://parçayı başında kaldıran borulara yönlendirir (desen bağlanır, not edin ^). Komut dosyasında komut ayırıcı /olarak sakınmak , onu daha okunaklı hale getirir ve düzende kaçma gereksinimini ortadan kaldırır . Komut ikame işlemi, boru hattının çıktısının çağrıldığı yerde ikame edildiği anlamına gelir .ssed/
v

Daha sonra şu şekilde kullanabilirsiniz:

cp -- v /path/to/destination

Bunun v, geçerli çalışma dizininde adlandırılmış bir dosya üzerinde işlem yapmayı zorlaştıracağına dikkat edin , çünkü hazır bilgi metni vher zaman değiştirilecektir. Çözüm olarak, göreceli yolu kullanabileceksiniz ./v.
(Ayrıca, bazı programların ön ekli olmayan tek harfli seçenekleri kabul ettiğini düşünün, örneğin mükemmel yasal (ancak POSIX dışı) ps v. Tek harfli genel takma adları yalnızca güvenli değildir).

Ve son olarak, en az değil, böyle bir takma ad, adı boşluk karakterleri içeren dosyalarla çalışmaz, çünkü takma ad değiştirildikten sonra kabuk tarafından bölünürler.

Alternatif olarak, global bir takma addan kaçınabilir ve tanımlayabilirsiniz:

alias v="xclip -selection clipboard -o | sed 's|^file://||'"

hangi olarak kullanılabilir:

cp -- "$(v)" /path/to/destination

Bu aynı zamanda boşluk karakterli dosya isimleri ile de çalışacaktır.

Ancak şunu unutmayın:

  1. Thrig'in cevabında açıklandığı gibi kabuğun ikame yeteneklerinin kullanılması daha verimli olacaktır.
  2. Dolphin tarafından görüntülenen ve panoya kopyalanan dosya adları kodlanmıştır ve bu nedenle nadir karakterler içerdiği sürece kabuk tarafından tüketilmeleri için uygun değildir. Örneğin:

    touch $'file with a\nnewline'
    # Copied in Dolphin
    % echo "$(v)"
    file with a%0Anewline
    % cat "$(v)"
    cat: '/path/to/file with a%0Anewline': No such file or directory
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.