Bir dosyanın tam yolunu bash olarak nasıl alabilirim?


20

Bir dosyanın tam yolunu bulmak için kolay bir yol istiyorum. Şu anda şunu yazıyorum:

echo `pwd`/file.ext

Kısaltmaya çalışarak, bir bash takma adı yaptım:

alias fp='echo `pwd`/'

Ama şimdi yazarsam fp file.ext, /ve arasında görünen bir boşluk var file.ext.

Böyle bir komut zaten var mı ve ben onu özlüyorum? Olmazsa, bash'da böyle bir takma ad veya işlev oluşturma konusunda nasıl giderim?

Yanıtlar:


27

Linux sistemlerinde, readlinkkurulu GNU coreutils projesinden sahip olmalısınız ve bunu yapabilirsiniz:

readlink -f file.ext

Debian / ubuntu sistemleri, "çoğunlukla coreutils paketinde olduğu gibi aynı işlevi sağlayan" realpath yardımcı programına sahip olabilir /bin/readlink -f.


readlink -f(ya da realpathuyumluluk için tutulan daha eski bir yardımcı programdır) ayrıca, zorunlu olarak arzu edilmeyen tüm sembolik bağları genişletecektir.
Gilles

8
fyi: macosx üzerinde çalışmaz.
akira

Mac'imde homebrew kullanarak coreutils kurdum ve içeriyor realpath.
Doug Harris

7

pwdKomutun yerine , PWDdeğişkeni kullanın (POSIX'de de var):

fp () {
  case "$1" in
    /*) printf '%s\n' "$1";;
    *) printf '%s\n' "$PWD/$1";;
  esac
}

Windows'u desteklemeniz gerekiyorsa, mutlak yolları tanımak, her bir unix aracının bağlantı noktası dosya yollarını çevirmek için kendi kurallarına sahip olduğundan daha karmaşık olacaktır. Cygwin ile cygpathyardımcı programı kullanın .


Belki bu senin seçimindir, ama bu fonksiyon yeni satırı çıkarmaz.
Cyrus

Bu yaklaşım, yalnızca harici binary çağırmaktan daha hızlı olan shell-builtins kullanma avantajına sahiptir. Bu gerçeği biraz daha netleştirmelisin.
akira

4

Şu anda kullandıklarınızla sorunuzu yanıtlamak için:

takma ad, şu anda yazdığınız konumda genişler. sen yazdın

% fp<SPACE>file.ext

bu olur

% echo `pwd`<SPACE>file.exe

Bundan kaçınmak için bir işlev kullanabilirsiniz:

function fp() {
    echo `pwd`/"$1"
}

Bunu her zamanki gibi kullanabilirsiniz:

% fp file.ext

Değişken ve komut ikamelerinin etrafında çift tırnak işareti gerekir:echo "`pwd`/$1"
Gilles

@Gilles: hangi şartlar altında?
akira

2
@ akira: Genişlemenin sonucunun globbing modeli olarak ele alınmasını ve globbing'in sonuçlarının kelimelere bölünmesini istemiyorsanız, daima çift tırnak işareti kullanın. Burada tek bir dosya adı oluşturuyorsunuz, bu nedenle çift tırnak işareti gerekir (işlevinizi *diğer dosyaları içeren bir dizinde adı verilen bir dosyayla deneyin ).
Gilles

' ' kabuk tarafından döndürülür (benim durumumda zsh) ve fonksiyona basmadan önce genişler. Fonksiyondan bu yana ilk parametre bu yana fp *verim /tmp/4cc3ea0c1b34b. Diğer parametreler dizindeki diğer dosyalar olacaktır. ' ' adında bir dosyam var olmaz , işlev hala beklendiği gibi çalışıyor, "*" veya * veya * ile çağırıyor
akira

bash, burada göründüğü gibi "kötü" olan, bash, neyi kastettiğinizi verir.
akira

3

Kullanabilirsiniz:

realpath file.ext

Bende o yok. Bu nereden geliyor?
frabjous

@ frabjous: Debian ve türevlerine özgüdür ve yalnızca talep etmeniz veya ona bağlı bir paket talep etmeniz durumunda kurulur.
Gilles

Arch kullanıyorum. Debian merkezli değil ama yine de AUR'de bir paket var. Zaten okuma bağlantısı varsa, yüklemeye değer olduğundan emin değilim.
frabjous

Bu bir seçenek; ya da bir işlevi düşünebilirsiniz, Gilles'nin cevabına bakınız . Neyse, bununla yapmak istediğiniz gerçek kullanıma bağlı (merak ediyorum).
cYrus

@ frabjous: Hangi sistemi kullandığınızı belirtmediniz, ancak eğer Yetenek tabanlı bir paket yöneticisi (Debian, Ubuntu, Mint, vb.) kullanıyorsa, coreutils ve flat ol ' realpath paketlerini apt-cache search realpathortaya çıkarmak için yazabilirsiniz . her ikisi de onu içerir. Yüklemek için daha sonra (veya ) yazabilirsiniz . sudo apt-get install realpathcoreutils
Michael Scheper
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.