Katakanlah saya punya dua jalur: <source_path>
dan <target_path>
. Saya ingin shell saya (zsh) secara otomatis mencari tahu apakah ada cara untuk mewakili <target_path>
dari <source_path>
sebagai jalur relatif.
Misalnya, mari kita asumsikan
<source_path>
aku s/foo/bar/something
<target_path>
aku s/foo/hello/world
Hasilnya adalah ../../hello/world
Mengapa saya membutuhkan ini:
Saya perlu ingin membuat symbolic link dari <source_path>
ke <target_path>
menggunakan relatif symbolic link bila memungkinkan, karena jika server samba kami tidak menunjukkan file dengan benar ketika saya mengakses file-file pada jaringan dari Windows (Saya bukan admin sys, dan don' t memiliki kendali atas pengaturan ini)
Dengan asumsi itu <target_path>
dan <source_path>
merupakan jalur absolut, berikut ini menciptakan tautan simbolik yang menunjuk ke jalur absolut .
ln -s <target_path> <source_path>
jadi tidak berfungsi untuk kebutuhan saya. Saya perlu melakukan ini untuk ratusan file, jadi saya tidak bisa memperbaikinya secara manual.
Adakah shell built-in yang menangani ini?
symlinks
untuk mengonversi tautan absolut ke relatif.Jawaban:
Anda bisa menggunakan
symlinks
perintah untuk mengubah jalur absolut menjadi relatif:Kami memiliki tautan absolut, mari ubah menjadi relatif:
Referensi
sumber
Coba gunakan
realpath
perintah (bagian dari GNUcoreutils
; > = 8.23 ), misalnya:Jika Anda menggunakan macOS, instal versi GNU melalui:
brew install coreutils
dan gunakangrealpath
.Perhatikan bahwa kedua jalur harus ada agar perintah berhasil. Jika Anda tetap membutuhkan jalur relatif walaupun salah satunya tidak ada, tambahkan -m switch.
Untuk contoh lebih lanjut, lihat Mengkonversi jalur absolut menjadi jalur relatif yang diberikan direktori saat ini .
sumber
realpath: unrecognized option '--relative-to=.'
:( versi realpath 1.19realpath
. Jika Anda berada di MacOS, menginstal melalui:brew install coreutils
.realpath (GNU coreutils) 8.26
tempat parameternya berada. Lihat: gnu.org/software/coreutils/realpath Periksa kembali apakah Anda tidak menggunakan alias (mis. Jalankan sebagai\realpath
), dan bagaimana Anda dapat menginstal versi daricoreutils
.Saya pikir solusi python ini (diambil dari pos yang sama dengan jawaban @ EvanTeitelman) juga layak disebut. Tambahkan ini ke Anda
~/.zshrc
:Anda kemudian dapat melakukannya, misalnya:
sumber
sys.argv
. Jika kode yang diposting salah atau dapat ditingkatkan, jangan ragu untuk melakukannya dengan terima kasih.Tidak ada builtin shell untuk menangani ini. Saya menemukan solusi pada Stack Overflow . Saya telah menyalin solusinya di sini dengan sedikit modifikasi dan menandai jawaban ini sebagai komunitas wiki.
Anda dapat menggunakan fungsi ini seperti:
sumber
Ini adalah solusi paling sederhana dan paling indah untuk masalah ini.
Juga harus bekerja pada semua cangkang seperti bourne.
Dan kebijaksanaan di sini adalah: sama sekali tidak perlu utilitas eksternal atau bahkan kondisi rumit. Beberapa pengganti awalan / sufiks dan loop sementara adalah semua yang Anda butuhkan untuk menyelesaikan apa saja yang dilakukan pada cangkang mirip-bourne.
Juga tersedia melalui PasteBin: http://pastebin.com/CtTfvime
sumber
Makefile
saya perlu menambahkan sepasang tanda kutip ganda ke barispos=${pos%/*}
(dan, tentu saja, titik koma dan garis miring terbalik di akhir setiap baris).relpath /tmp /tmp
,relpath /tmp /tmp/a
,relpath /tmp/a /
. Di tambah, Anda lupa menyebutkan bahwa semua jalur harus absolut DAN dikanonikkan (mis./tmp/a/..
Tidak berfungsi)Saya harus menulis skrip bash untuk melakukan ini dengan andal (dan tentu saja tanpa memverifikasi keberadaan file).
Pemakaian
Mengembalikan jalur sumber relatif.
contoh:
keduanya dapatkan
../../CC/DD/EE
Untuk melakukan tes cepat, Anda dapat menjalankan
hasil: daftar tes
BTW, jika Anda ingin menggunakan skrip ini tanpa menyimpannya dan Anda mempercayai skrip ini, maka Anda memiliki dua cara untuk melakukannya dengan bash trick.
Impor
relpath
sebagai fungsi bash dengan mengikuti perintah. (Membutuhkan bash 4+)atau hubungi script on-the-fly seperti dengan curl bash combo.
sumber