bir dosyanın mutlak yolunu bash / fish komutu


448

Soru: Hangi dosyayı beslediğim mutlak yolu yazdırmak için basit bir sh / bash / zsh / fish / ... komutu var mı?

Kullanım durum: Ben dizinde olduğum /a/bve dosyanın tam yolunu yazdırmak istiyorum cKolayca başka bir programa yapıştırmak böylece komut satırında: /a/b/c. Basit, ancak bunu yapmak için küçük bir program, sonunda uzun yolların ele alınmasında muhtemelen 5 veya birkaç saniye kazandırabilir. Bunu yapmak için standart bir yardımcı program bulamam beni şaşırtıyor - gerçekten yok mu?

İşte örnek bir uygulama, abspath.py:

#!/usr/bin/python
# Author: Diggory Hardy <diggory.hardy@gmail.com>
# Licence: public domain
# Purpose: print the absolute path of all input paths

import sys
import os.path
if len(sys.argv)>1:
    for i in range(1,len(sys.argv)):
        print os.path.abspath( sys.argv[i] )
    sys.exit(0)
else:
    print >> sys.stderr, "Usage: ",sys.argv[0]," PATH."
    sys.exit(1)

@ DennisWilliamson'ın cevabının (-m seçeneğini kullanarak) (genellikle) daha taşınabilir olması ve mevcut olmayan dosyalarla çalışmaktan üstün olduğunu iddia ediyorum.
TTT

Veya Flimm'in cevabı; her ikisi de iyi çözümlerdir. Ancak Bannier benim orijinal sorumu en iyi şekilde cevaplıyor .
dhardy

3
OSX kullanıcıları: bu cevaba
Ian

Yanıtlar:


562

Deneyin realpath.

$ realpath example.txt
/home/username/example.txt

133
+1, çok güzel bir program. Ancak, bunun harici bir komut olduğunu (yerleşik bir kabuk değil) ve varsayılan olarak her sistemde bulunmayabileceğini unutmayın, yani yüklemeniz gerekebilir. Debian'da aynı ada sahip ayrı bir pakette bulunur.
Roman Cheplyaka


1
@Flimm: Bazı göreli yollar göz önüne alındığında size geçerli bir yol verecektir. Dosya varlığını öğrenmek istiyorsanız, örneğin test gibi başka bir araç kullanın.
Benjamin Bannier

14
@Dalin: Coreutils kurmayı deneyin. İkili grealpath olarak adlandırılır.
Toni Penya-Alba

5
Bu araç GNU coreutils 8.15'te (2012'de) tanıtıldı, bu yüzden oldukça yeni.
marbu

319

readlinkHangisinin sembolik bağlantıları çözeceğini deneyin :

readlink -e /foo/bar/baz

50
Varolmayan bir dosyanın mutlak yolunu görebilmemiz için '-e' yerine '-f' kullanmayı tercih ederim.
hluk

5
Bu benim için en basit ve aynı zamanda taşınabilir gibi görünüyor. readlink gnu coreutils portudur, bu nedenle bazı gömülü olanlar dışında neredeyse tüm linux dağıtımlarına kurulacaktır.
catphive

14
Bana öyle geliyor ki -mkullanmak için en iyi seçenek.
Matt Joiner

1
@Dalin: /usr/bin/readlinkMavericks'te. Yoksa bu seçeneklerin OS X'te bulunmadığını mı kastettiniz? Bir bodur BSD versiyonu gibi görünüyor ...: p
iconoclast

14
@iconoclast Bu seçenekler OSX'te ve BSD readlinkkılavuzuna göre mevcut değildir : only the target of the symbolic link is printed. If the given argument is not a symbolic link, readlink will print nothing and exit with an errorbu nedenle readlink,
OSX'de

257
#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"

8
Her şeyi teklif etmeyi unutmayın. Nedenini anlamıyorsanız, programınızı bir dosyada deneyin a b(a ve b arasındaki iki boşluk, SO bunlardan birini yer).
Roman Cheplyaka

1
Ayrıca bunu "/" de dener "///" dönüşür
George

35
readlink ve realpath POSIX olmadığından çalıştırılabilir bir dosya yazmanızı ve derlemenizi gerektirmeyen tek POSIX çözümü
Ciro Santilli 郝海东 郝海东 病 六四 事件 法轮功

25
Kullandığım function realpath { echo $(cd $(dirname $1); pwd)/$(basename $1); }kendime yapmak realpathOS X'de Teşekkürlerimizle komutu (şu anda kabul yanıt)!
James Bedford

1
Bu yöntemi komut dosyaları için günlük dosya adlarını tanımlamak için kullandım:LOG=$(echo $(cd $(dirname $0); pwd)/$(basename $0 .sh).log)
DrStrangepork

85

Unutmayın readlinkve realpathhangisi sisteminizde yüklü olabilir veya olmayabilir.

Burada dogbane cevabını genişleterek bir fonksiyon olarak ifade edilir:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}

daha sonra şu şekilde kullanabilirsiniz:

myabsfile=$(get_abs_filename "../../foo/bar/file.txt")

Nasıl ve neden çalışır?

Çözüm, Bash yerleşik pwdkomutunun bağımsız değişken çağrıldığında geçerli dizinin mutlak yolunu basması gerçeğinden yararlanır .

Bu çözümü neden seviyorum?

Taşınabilir ve ne gerektirmez readlinkveya realpathgenellikle varsayılan mevcut değil hangi belirli bir Linux / Unix dağıtıma yükleyin.

Dir yoksa?

Yukarıda belirtildiği gibi işlev başarısız olur ve verilen dizin yolu yoksa stderr üzerine yazdırır. İstediğiniz bu olmayabilir. Bu durumu ele almak için işlevi genişletebilirsiniz:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  if [ -d "$(dirname "$1")" ]; then
    echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
  fi
}

Üst dizinlerden biri yoksa şimdi boş bir dize döndürür.

Sondaki '..' veya '.' girdi?

Bu durumda mutlak bir yol veriyor, ama minimal bir yol değil. Şöyle görünecektir:

/Users/bob/Documents/..

Eğer '..' kodunu çözmek istiyorsanız betiği şu şekilde yapmanız gerekir:

get_abs_filename() {
  # $1 : relative filename
  filename=$1
  parentdir=$(dirname "${filename}")

  if [ -d "${filename}" ]; then
      echo "$(cd "${filename}" && pwd)"
  elif [ -d "${parentdir}" ]; then
    echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
  fi
}

Güzel bir işlev, ama görünüşe göre soruyu anlamadınız. Komut dosyası değil, etkileşimli kullanım için bir şey istedim.
dhardy

3
realpathAyrıca who, touchveya gibi araçlar içeren coreutils paketinden gelen eklemek istiyorum cat. Oldukça standart bir GNU araçları seti, bu yüzden hemen hemen her linux tabanlı makineye yüklendiğinden emin olabilirsiniz. GNU unix olmayan sistemler (OpenBSD gibi) ii) bu araçlar 8.15 sürümünde tanıtıldı (bu yüzden 2012'den itibaren oldukça yeni), bu yüzden uzun vadeli kararlı sistemlerde (RHEL 6 gibi) özleyeceksiniz.
marbu

1
Görünüşe göre en azından Continuum Analytics ( Anaconda Python dağıtımının yapımcıları ) bu cevabı beğendi. Conda aracı tarafından oluşturulan sanal ortamları etkinleştirmek için kullanılan "etkinleştir" komut dosyalarında ( buraya bağlantı veren bir referansla) uygulanır. Yani… iyi olan!
wjv

1
Bu yalnızca dizinler için geçerlidir (başka bir şey olmadığı için) ve ".." ve "." İle baş edemez. Her şeyi halletmesi gereken cevabımı görün: stackoverflow.com/a/23002317/2709
Alexander Klimetschek

3
@marbu realpath Ubuntu 14.04 veya Debian Wheezy'de mevcut değildir. Zamanla biraz standart hale gelebilir, ama kesinlikle şimdi değil. OP'nin linux veya GNU hakkında hiçbir şey söylemediğini de unutmayın. Bash bundan daha yaygın olarak kullanılır.
mc0e

77
$ readlink -m FILE
/path/to/FILE

Bu daha iyi olduğunu readlink -e FILEya realpathda dosya yoksa bile çalıştığı için.


Güzel. Bu, varolan ancak sembolik olmayan dosyalar / dizinler üzerinde de çalışır.
quietmint

OS X 10.9 (Mavericks) üzerinde mevcut readlink var, bu yüzden bu kesinlikle en iyi cevap.
Kenneth Hoste

6
@KennethHoste: Bu -mseçenek Mavericks'te mevcut değildir.
iconoclast

2
Kesinlikle bir DEFAULT OSX kurulumunda değil.
Fran Marzoa

linux (CentOS) üzerinde çalışıyor teşekkür ederim, çünkü realpath bunun için mevcut değildi
jimh

66

Mutlak yol dönüştürücü kabuk işlevine bu göreceli yol

  • herhangi bir yardımcı program gerektirmez (sadece cdve pwd)
  • dizinler ve dosyalar için çalışır
  • kolları ..ve.
  • dir veya dosya adlarındaki boşlukları işler
  • dosya veya dizinin mevcut olmasını gerektirir
  • verilen yolda hiçbir şey yoksa hiçbir şey döndürmez
  • mutlak yolları girdi olarak ele alır (esasen bunları iletir)

Kod:

function abspath() {
    # generate absolute path from relative path
    # $1     : relative filename
    # return : absolute path
    if [ -d "$1" ]; then
        # dir
        (cd "$1"; pwd)
    elif [ -f "$1" ]; then
        # file
        if [[ $1 = /* ]]; then
            echo "$1"
        elif [[ $1 == */* ]]; then
            echo "$(cd "${1%/*}"; pwd)/${1##*/}"
        else
            echo "$(pwd)/$1"
        fi
    fi
}

Örneklem:

# assume inside /parent/cur
abspath file.txt        => /parent/cur/file.txt
abspath .               => /parent/cur
abspath ..              => /parent
abspath ../dir/file.txt => /parent/dir/file.txt
abspath ../dir/../dir   => /parent/dir          # anything cd can handle
abspath doesnotexist    =>                      # empty result if file/dir does not exist
abspath /file.txt       => /file.txt            # handle absolute path input

Not: Bu nolan6000 ve bsingh'ın cevaplarına dayanır , ancak dosya durumunu düzeltir.

Ayrıca orijinal sorunun mevcut bir komut satırı yardımcı programı hakkında olduğunu anlıyorum. Ancak bu, en az bağımlılığa sahip olmak isteyen kabuk komut dosyaları dahil olmak üzere stackoverflow'daki soru gibi göründüğü için, bu komut dosyası çözümünü buraya koydum, bu yüzden daha sonra bulabilirim :)


Teşekkürler. OSX'te bununla devam ediyorum
Greg

Bu, boşluklu dizinler için işe yaramaz, yani: $ abspath 'a b c/file.txt'Bunun nedeni, argümanından cdalıntı yapılmamasıdır. Bunun üstesinden gelmek için, argümanın tamamını tırnak içine almak yerine ( echobu tırnakların bir nedeni var mı?) Sadece yol argümanlarını alıntılayın. Yani yerini echo "$(cd ${1%/*}; pwd)/${1##*/}"ile echo $(cd "${1%/*}"; pwd)/${1##*/}.
george

@george Kaydettiğiniz için teşekkürler, düzelttim.
Alexander Klimetschek

1
Düzinelerce yarım eğimli çözümden geçtim ve bu kesinlikle en özlü ve doğru bash-salt çözüm gibi görünüyor. Yapabilirsin ince daha da değiştirerek echo "$(cd "$1"; pwd)"ile (cd "$1"; pwd). Burada ekoya gerek yok.
Altı

@Six True, güncellendi. Diş telleri ( ... )hala gereklidir, bu nedenle cdherhangi bir arayan için çalışma dizinini değiştirmek istemediğimiz için bir alt kabukta olur abspath.
Alexander Klimetschek

24

findKomut yardımcı olabilir

find $PWD -name ex*
find $PWD -name example.log

Geçerli dizindeki veya altındaki tüm desenleri desenle eşleşen adlarla listeler. Yalnızca birkaç sonuç alırsanız (örn. Ağacın altına yakın birkaç dosya içeren dizin) basitleştirebilirsiniz.

find $PWD

Bunu, adı geçen diğer yardımcı programlara sahip olmayan Solaris 10'da kullanıyorum.


1
ilk okuma bu yorum grok vermedi; Buradaki anahtar nokta, find komutuna mutlak bir yol verirseniz, sonuçların mutlak yolla çıkmasıdır. $ PWD kullanmak bulunduğunuz yerin mutlak yoludur, böylece çıktıyı mutlak olarak elde edersiniz.
simbo1905

4
Eğer güvenirseniz, PWDsadece kullanabilirsiniz $PWD/$filename.
jonny

Bu yaklaşım -maxdepth 1 kullanımıyla geliştirilebilir. Ayrıca, bunu nasıl kullandığınıza bağlı olarak burada alıntı yapmayı da unutmayın.
14:57

1
@jonny: $ dosyaadı zaten mutlaksa $ PWD / $ dosyaadı başarısız olur.
mc0e

Dosya adı "./filename.txt" (baştaki nokta ve eğik çizgi ile) olarak verilirse bu başarısız olur.
Mark Stosberg

15

Eğer readlink veya realpath yardımcı programlarınız yoksa, bash ve zsh'de çalışan aşağıdaki işlevi kullanabilirsiniz (geri kalanından emin değilsiniz).

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

Bu, varolmayan dosyalar için de çalışır (python işlevi gibi os.path.abspath).

Ne yazık ki abspath ./../somefilenoktalardan kurtulmuyor.


1
Bana taşınabilir görünüyor. Öte yandan, örneğin bir satırsonu içeren bir dosya adında kırılır.
Roman Cheplyaka

1
Yerine, daha fazla geliştirmek için echo "$1"olan printf "%s\n" "$1"(ikinci eko ile aynı). echoargümanları içindeki ters eğik çizgileri yorumlayabilir.
Roman Cheplyaka

Yine haklısın! Gerçekten, zsh'daki echo komutunun davranışı bash'tan farklıdır.
hluk

1
Açıkça söylemek gerekirse, argümanlar ters eğik çizgi içeriyorsa, POSIX altında yankı davranışı tanımsızdır. Ancak, XSI uzantısı altında tanımlanır (yani echo kaçış dizilerini yorumlamalıdır). Ama hem bash hem de zsh POSIX uyumluluğundan çok uzak ...
Roman Cheplyaka

Üzgünüm, ama anlamýyorum. Zaten bu daha fazla özellik ile bir komut dosyası olarak bir cevap sağladı ve bir kabuk komut dosyası içinde kullanılması gerekmez.
10:43

10

İşte kompaktlığı için sevdiğim sadece zsh işlevi. 'A' genişletme değiştiricisini kullanır - bkz. Zshexpn (1).

realpath() { for f in "$@"; do echo ${f}(:A); done }

Vay be bu zarif bir çözüm !!
ShellFish

6

Genellikle böyle bir şey yoktur olarak bir dosyaya (genel olarak birden fazla, kesin maddenin dolayısıyla kullanımı olabileceğini bu açıklama vasıtası ile uygun değildir). An kökten "/" başlayan ve belirsiz bir dosyayı çalışma dizininden bağımsız olarak belirten herhangi bir yoldur (bkz . Wikipedia ). absolute pathabsolute path

A relative path, başka bir dizinden başlayarak yorumlanması gereken bir yoldur. Bir çalışma dizini olabilir.relative pathBir uygulama tarafından manipüle ediliyorsa (mutlaka olmasa da) . Bir dizindeki sembolik bir bağ içindeyse, genellikle bu dizine göre olması amaçlanır (ancak kullanıcının aklında başka kullanımlar olabilir).

Dolayısıyla mutlak bir yol sadece kök dizine göre bir yoldur.

Bir yol (mutlak veya göreli) sembolik bağlantılar içerebilir veya içermeyebilir. Değilse, bağlantı yapısındaki değişikliklere de biraz geçirimsizdir, ancak bu mutlaka gerekli veya hatta arzu edilmez. Bazı insanlar , tüm sembolik bağlantıların çözüldüğü bir çağrıyı canonical path(veya canonical file nameveya resolved path) çağırır absolute path, yani bağlantı kurdukları yere bir yolla değiştirilir. Komutlar realpathve readlinkher ikisi de kanonik bir yol arar, ancak yalnızca realpathsembolik bağlantıları çözmek için uğraşmadan mutlak bir yol elde etme seçeneğine sahiptir (bazı dizinlere mutlak veya göreceli çeşitli yol türleri elde etmek için birkaç seçenekle birlikte).

Bu birkaç açıklama gerektirir:

  1. sembolik bağlantılar ancak bağlantı kurmaları gereken her şey zaten oluşturulmuşsa çözülebilir, ki bu her zaman böyle değildir. Komutlar realpathve readlinkbunu hesaba katmak için seçenekler var.
  2. yoldaki bir dizin daha sonra sembolik bir bağlantı haline gelebilir, bu da yolun artık olmadığı anlamına gelir canonical. Dolayısıyla kavram zamana (veya çevreye) bağlıdır.
  3. ideal durumda bile, tüm sembolik bağlantılar çözülebildiğinde, canonical pathiki nedenden dolayı bir dosyada birden fazla olabilir :
    • dosyayı içeren bölüm robirkaç bağlama noktasına aynı anda ( ) monte edilmiş olabilir .
    • dosyaya sabit bağlantılar olabilir, yani dosya birkaç farklı dizinde bulunur.

Bu nedenle, çok daha kısıtlayıcı bir tanımla bile, canonical pathbir dosyaya birkaç kanonik yol olabilir. Bu aynı zamanda niteleyicinin canonicalbir şekilde yetersiz olduğu anlamına gelir, çünkü genellikle teklik kavramını ima eder.

Bu, Bash'teki benzer başka bir sorunun cevabında konuyla ilgili kısa bir tartışmayı genişletir : göreceli verilen mutlak yolu al

Benim sonucum realpathdaha iyi tasarlanmış ve çok daha esnek olmasıdır readlink. Bunun readlinkkapsamadığı tek kullanım realpathseçeneği, sembolik bir bağlantının değerini döndüren seçenek olmadan yapılan çağrıdır.


Aşağı indirilmeyi umursamıyorum, ancak teknik veya sitede uygun uygulama olarak kabul edilen şeylerle ilgili bir şey öğrenebilmem için nedenini anlamaktan hoşlanıyorum. En azından yerel sosyolojiyi daha iyi anlamak için Meta Stack Overflow'a kaydolmamı sağladı. Ben tavsiye ederim. - Yine de, herhangi birinin cevabımın uygunsuzluğu hakkında bir fikri varsa, ilgileniyorum.
babou

1
(a) sorunun 2 + 1/2 yıl önce geçerli bir cevabı varsa, (b) göreceli bir yola (istediğim gibi) karşılık gelen (tek istediğim) mutlak bir yol olsa da, sizin gibi bir dosyaya belki de dikkat çekti. BTW realpathvs vs hakkında readlinkya da sembolik bağlantılar hakkında herhangi bir yorum sordum ne fazlası.
dhardy

1
İkinci yorum: Kısa cevaplar uzun derslerden çok daha yararlıdır. Yığın taşması genellikle belirli sorular sormak için kullanılır.
dhardy

5
1- Bir sorunun uzun süredir geçerli bir cevabı olması, kapalı olduğu anlamına gelmez. Sorular sadece kişisel kullanım için tasarlanmamıştır. Gerçekten de, doğrulanmış cevaptan daha fazla oy toplayan cevaplar için rozetler var. Ve yeni araçlarla, "en iyi" cevap zaman içinde değişebilir. Birçok kişi web araması yoluyla erişilen eski yanıtları kullanır.
babou

1
2 - Göreceli bir yola karşılık gelen (tek) mutlak bir yol olduğu konusunda ısrar ediyorsunuz . "Karşılık gelen" ile ne demek istediğinizi tahmin etsem de, yani belirli bir dönüşümler kümesinden orijinalinden türetilmiş bir yol olsa da, ifadeniz hala yanlıştır. Eşsiz bir "karşılık gelen" kanonik yol vardır. Kelime canonicaltam olarak bir dönüşüm kümesine göre bu tekliğe işaret eder. Ancak, örneğin, / dev / cdrom aslında / dev / sr0 için bir bağlantı olmasına rağmen mükemmel bir mutlak yoldur. Her ikisi de aynı cihaza işaret ediyor. Orijinal cevabım ilgili bir web makalesine işaret etti.
babou

5

dogbane Cevap başına gelecek olaylar bilgi ile:

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"

Açıklama:

  1. Bu komut dosyası bağımsız değişken olarak göreli yol al "$1"
  2. Sonra bu yolun dirname bölümünü alırız (dir veya dosyayı bu betiğe aktarabilirsiniz):dirname "$1"
  3. Sonra biz cd "$(dirname "$1")bu göreceli dir içine ve pwdshell komutu çalıştırarak bunun için mutlak yol olsun
  4. Bundan sonra muten yola taban adı ekliyoruz :$(basename "$1")
  5. Son adım biz echoonu

2

Dizinler dirnameiçin takılır ../ve geri döner ./.

nolan6000'in işlevi bunu düzeltmek için değiştirilebilir:

get_abs_filename() {
  # $1 : relative filename
  if [ -d "${1%/*}" ]; then
    echo "$(cd ${1%/*}; pwd)/${1##*/}"
  fi
}

1
SO hoş geldiniz! Küçük değişiklikler ve açıklamalar için, mevcut bir cevaba yorum eklemek, özellikle bu kopyalanan cevap orijinal cevabın diğer bilgilerinin çoğuna sahip değilse, bir cevap eklemekten daha uygun olabilir. Biraz daha itibar kazandıktan sonra, başkalarının yanıtlarına yorum ekleyebilirsiniz. Şimdilik, benzersiz, değerli sorular sorarak veya tek başına iyi yanıtlar vererek itibar kazanmaya çalışın.
cfi

1
Nolan6000'in cevabına atıfta bulunduğunuz için, poster dhardy'ın bir senaryo aradığı için nolan6000'in cevabını kabul etmeyeceğini zaten yorumladığını lütfen unutmayın. Bu yüzden kesinlikle cevabınız soruya cevap vermez.
cfi

fonksiyon .profileinteraktif kullanım için eklenebilir ve dolayısıyla kullanılabilir.
adib

Bu takdirde çalışmaz $1düz dosya adıdır: get_abs_filename foo-> hiçbir şey (ya <current_dir>/foo/fooeğer foobir dizindir).
ivan_pozdeev

2

Bu sorunun cevabı değil, senaryo yazanlar için:

echo `cd "$1" 2>/dev/null&&pwd||(cd "$(dirname "$1")";pwd|sed "s|/*\$|/${1##*/}|")`

/ .. ./ etc komutunu doğru şekilde işler. Ayrıca OSX üzerinde de çalışıyorum


2

Sistemime aşağıdaki komut dosyasını yerleştirdim ve hızlı bir şekilde geçerli dir bir dosyaya tam yolunu almak istediğinizde bir bash diğer adı olarak adlandırıyorum:

#!/bin/bash
/usr/bin/find "$PWD" -maxdepth 1 -mindepth 1 -name "$1"

Neden emin değilim, ama, bir komut dosyası tarafından çağrıldığında OS X üzerinde "$ PWD" mutlak yola genişler. Komut satırında find komutu çağrıldığında, komut verilmez. Ama istediğimi yapıyor ... tadını çıkarın.


$PWDher zaman çalışan yöneticinin mutlak yolu vardır. Ayrıca, findeğik çizgileri tolere etmez, bu yüzden soruyu sorulduğu gibi cevaplamazsınız. Yapmak istediklerinizi yapmanın daha hızlı bir yolu sadeceecho "$PWD/$1"
Adam Katz

2

Yalnızca yerleşikleri kullanmak istiyorsanız en basit olanı muhtemelen:

find `pwd` -name fileName

Sadece ekstra iki kelime yazmak ve bu tüm unix sistemlerinde ve OSX üzerinde çalışacaktır.


Daha -maxdepth 1önce ekleyeceğim -name(dosyanın geçerli dizinde olduğunu varsayalım). Bu olmadan, pwd'nin herhangi bir alt dizinindeki dosyalarla çalışır, ancak diğerleriyle çalışmaz.
Walter Tross

Gerçekten haklısın, soru dosyanın geçerli dizinde olacağını belirtti. "Başkalarıyla değil" ne demek istiyorsun?
Arj

Yani findaltında dizin ağacının dışında bir dosya bulamazsınız pwd. Örneğin, eğer denerseniz find . -name ../existingFile, başarısız olur.
Walter Tross

Yeterince adil, evet bu, bir dosyanın tam yolunu cwd'nizde (orijinal soruya göre) veya cwd ağacınızın herhangi bir yerinde (orijinal soruda değil) yazdırmak istediğinizi varsayar.
Arj

1
#! /bin/bash

file="$@"
realpath "$file" 2>/dev/null || eval realpath $(echo $file | sed 's/ /\\ /g')

Bu, realpathbir kabuk betiğinde saklamanın eksikliklerini telafi eder fullpath. Şimdi arayabilirsiniz:

$ cd && touch a\ a && rm A 2>/dev/null 
$ fullpath "a a"
/home/user/a a
$ fullpath ~/a\ a
/home/user/a a
$ fullpath A
A: No such file or directory.

Ne çözüyor? realpath "foo bar"-> /home/myname/foo bar. Komut satırı bağımsız değişkenlerini alıntılamaktan rahatsız olmazsanız, bu bir realpathhata değildir .
ivan_pozdeev

Kabul etti, daha çok kullanışlı bir sargı.
ShellFish

1

Ruby'de mutlak yolu elde etmenin bir alternatifi :

realpath() {ruby -e "require 'Pathname'; puts Pathname.new('$1').realpath.to_s";}

Bağımsız değişken olarak (geçerli klasör) ve göreli ve mutlak dosya veya klasör yolu olmadan çalışır.


0

Homebrew ile cevap

realpathen iyi yanıttır, ancak yüklü değilse, ilk olarak coreutils'i harika işlevlerle brew install coreutilsyükleyecek olan çalıştırmalısınız . Özel bir işlev yazmak ve dışa aktarmak, bunun gibi bir şey için çok fazla iş ve hata riski taşır, işte iki satır:

$ brew install coreutils
$ realpath your-file-name.json 

-1

Hey millet biliyorum bu eski bir konu ama ben sadece bunu benim gibi ziyaret eden başka birine referans için gönderiyorum. Soruyu doğru anladıysam, locate $filenamekomutu düşünüyorum . Sağlanan dosyanın mutlak yolunu görüntüler, ancak yalnızca varsa.


4
locatedosyaları / yolları ada göre aramak için kullanılan bir yardımcı programdır. İşi yapabilir, ancak diğer eşleşmeleri de bulabilir ve updatedbönce kök olarak çağırmadan mevcut bir dosyayı bulamayabilir .
dhardy
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.