Saya sedang mencari perintah sederhana yang dapat digunakan dalam Bash untuk menemukan jalur absolut dan dikanonikkan file pada OS X (mirip dengan `` readlink -f'` di Linux).
Sesi bash sampel berikut menjelaskan utilitas [fiktif] yang disebut `` abspath'` yang memperlihatkan perilaku yang diinginkan:
$ pwd
/Users/guyfleegman
$ ls -lR
drwxr-xr-x 4 guyfleegman crew 136 Oct 30 02:09 foo
./foo:
-rw-r--r-- 1 guyfleegman crew 0 Oct 30 02:07 bar.txt
lrwxr-xr-x 1 guyfleegman crew 7 Oct 30 02:09 baz.txt -> bar.txt
$ abspath .
/Users/guyfleegman
$ abspath foo
/Users/guyfleegman/foo
$ abspath ./foo/bar.txt
/Users/guyfleegman/foo/bar.txt
$ abspath foo/baz.txt
/Users/guyfleegman/foo/baz.txt
Seperti dengan doa terakhir `` abspath'` dalam contoh di atas, saya lebih suka itu tidak secara otomatis menyelesaikan symlink, tapi saya tidak akan terlalu pilih-pilih di sini.
macos
osx-snow-leopard
bash
shell
Michael Wehner
sumber
sumber
Jawaban:
Contoh:
sumber
Saya tidak berpikir ada perintah buildin yang melakukan ini. Jesse Wilson menulis skrip bash untuk ini:
Namun, itu tidak berfungsi dengan baik untuk jalur langsung di bawah ini
/
, seperti/etc
(pencetakan//etc
), serta.
dan..
(mencetak/cwd/.
dalam kedua kasus). Saya mencoba memodifikasinya, tetapi bash-fu saya yang tidak memadai gagal.Ini saran saya:
Simpan sebagai
/usr/bin/abspath
atau sesuatu seperti itu dan membuatnya dapat dieksekusi. Output sampel:Jika Anda melakukan ingin resolusi symlink, mengubah
print
baris seperti ini:untuk mendapatkan ini:
sumber
file /usr/bin/xattr
Salah satu opsi adalah menginstal saja coreutils dan menggunakannya
greadlink -f
. Ini memecahkan symlink dan berfungsi dengan/Foo/
atau~/foo.txt
jika mereka tidak ada, tetapi tidak dengan/Foo/foo.txt
jika/Foo/
tidak ada.Ini tidak menyelesaikan symlink, dan tidak bekerja dengan
/Foo/foo.txt
baik.dirs -l
melakukan ekspansi tilde.dirs +0
hanya mencetak direktori paling atas jika ada direktori lain di tumpukan.sumber
Saya kira Anda bisa melakukannya dengan python atau ruby.
atau buatlah perintah dengan
sumber
Jika Anda memiliki modul File :: Spec diinstal untuk perl Anda bisa melakukan ini:
sumber
Untuk skrip bash / sh Anda dapat menggunakan fungsi rekursif ini:
sumber
__filename
. Script saat ini berperilaku lebih sepertidirname
.Instal pustaka berikut untuk OSX:
sumber
Jika menginstal coreutils bukan opsi, berikut ini menangani kombo symlink,. dan .. dan bekerja pada file dan folder seperti GNU realpath:
Tetapi itu tidak mendukung realpath - relatif-untuk. Ini membutuhkan /programming//a/12498485/869951 .
sumber
Mengingat batasannya adalah MacOS (OS X pada saat itu), PHP tersedia secara default. Ini akan mengembalikan direktori root file. Hapus
dirname
untuk mendapatkan file juga.sumber