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?

Jens Erat
sumber

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."

Doug Harris
sumber
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.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
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
akira
sumber
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
cYrus
sumber
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")"
Philippe Carphin
sumber