Bagaimana cara mendapatkan path lengkap file dalam bash?


22

Saya ingin cara mudah untuk mendapatkan path lengkap ke file. Saat ini saya mengetik ini:

echo `pwd`/file.ext

Mencoba mempersingkat, saya membuat alias bash:

alias fp='echo `pwd`/'

Tetapi sekarang jika saya mengetik fp file.ext, ada ruang yang muncul antara /dan file.ext.

Apakah perintah seperti itu sudah ada, dan saya melewatkannya? Jika tidak, bagaimana cara membuat alias atau fungsi di bash?

Jawaban:


30

Pada sistem linux, Anda harus menginstal readlinkdari proyek GNU coreutils dan dapat melakukan ini:

readlink -f file.ext

Sistem Debian / ubuntu dapat menginstal utilitas realpath yang "menyediakan sebagian besar fungsi yang sama seperti /bin/readlink -fdalam paket coreutils."


readlink -f(atau realpath, yang merupakan utilitas lama disimpan untuk kompatibilitas) juga akan memperluas semua tautan simbolik, yang tidak selalu diinginkan.
Gilles 'SANGAT berhenti menjadi jahat'

8
fyi: tidak berfungsi di macosx.
akira

Di mac saya, saya telah menginstal coreutils menggunakan homebrew dan itu termasuk realpath.
Doug Harris

7

Alih-alih pwdperintah, gunakan PWDvariabel (itu dalam POSIX juga):

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

Jika Anda perlu mendukung Windows, mengenali jalur absolut akan lebih rumit karena setiap port alat unix memiliki aturan sendiri untuk menerjemahkan jalur file. Dengan Cygwin, gunakan cygpathutilitas.


Mungkin itu pilihan Anda tetapi fungsi ini tidak akan menampilkan baris baru.
cYrus

pendekatan ini memiliki keuntungan menggunakan hanya shell-builtin, yang lebih cepat daripada memanggil binari eksternal. Anda harus membuat fakta ini sedikit lebih jelas.
akira

4

untuk menjawab pertanyaan Anda dengan apa yang Anda gunakan sekarang:

alias mengembang pada posisi di mana Anda mengetik sekarang. Anda mengetik:

% fp<SPACE>file.ext

ini menjadi

% echo `pwd`<SPACE>file.exe

Anda bisa menggunakan fungsi untuk menghindari itu:

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

Anda dapat menggunakannya seperti biasa:

% fp file.ext

Anda perlu tanda kutip ganda di sekitar pengganti variabel dan perintah:echo "`pwd`/$1"
Gilles 'SO- stop being evil'

@Gilles: dalam kondisi apa?
akira

2
@akira: Selalu gunakan tanda kutip ganda kecuali jika Anda ingin hasil ekspansi diperlakukan sebagai pola globbing dan hasil globbing dibagi menjadi kata-kata. Di sini Anda membuat nama file tunggal, sehingga tanda kutip ganda diperlukan (coba fungsi Anda dengan file yang disebut *dalam direktori yang berisi file lain).
Gilles 'SANGAT berhenti menjadi jahat'

' ' di-globbed oleh shell (zsh dalam kasus saya) dan diperluas sebelum mereka menekan fungsi. fp *menghasilkan /tmp/4cc3ea0c1b34bsejak itulah paramete pertama untuk fungsi tersebut. parameter lainnya adalah file lain dalam direktori. segera setelah saya memiliki file bernama ' ' fungsi masih berfungsi seperti yang diharapkan, memanggilnya dengan "*" atau * atau *
akira

bash adalah yang "buruk" di sini seperti yang terlihat, bash menghasilkan apa yang Anda maksud.
akira

3

Kamu bisa memakai:

realpath file.ext

Saya tidak punya itu. Dari mana datangnya?
frabjous

@frabjous: khusus untuk Debian dan turunannya, dan hanya akan diinstal jika Anda telah memintanya atau paket yang bergantung padanya.
Gilles 'SANGAT berhenti menjadi jahat'

Saya menggunakan Arch. Itu bukan berbasis Debian, tapi ada paket untuk itu di AUR. Tidak yakin itu layak diinstal jika saya sudah memiliki tautan baca.
frabjous

Ya, itu pilihan; atau Anda dapat mempertimbangkan suatu fungsi, lihat jawaban Gilles . Pokoknya itu tergantung pada penggunaan nyata yang ingin Anda lakukan dengan itu (saya ingin tahu).
cYrus

@frabjous: Anda tidak menentukan sistem apa yang Anda gunakan, tetapi jika ia menggunakan manajer paket berbasis Aptitude (Debian, Ubuntu, Mint, dll.), Anda dapat mengetik apt-cache search realpathuntuk mengungkapkan bahwa paket-paket realpath coreutils dan plain ol ' keduanya mengandung itu. Anda kemudian dapat mengetik (atau ) untuk menginstalnya. sudo apt-get install realpathcoreutils
Michael Scheper

1

Dari /programming//a/3915420/5795941

Ini satu-satunya cara yang bisa saya terima. Tidak memperluas tautan seperti tautan langsung dan tautan baca dan merupakan cara klasik untuk melakukannya yang pernah saya lihat di mana-mana.

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.