Saya ingin scp
file ke server. File tersebut adalah tautan simbolis, dan sebenarnya yang ingin saya lakukan adalah menyalin file sumber. Lagi pula saya tidak ingin melacak jalur file sumber secara manual, karena itu bisa diganti. Jika saya bisa mendapatkan path absolut file sumber, saya bisa sep
dengan itu. Bagaimana saya bisa mendapatkan jalan?
99
scp
versi mengikuti symlink secara default, bukan? Anda harus memeriksa milik Anda dan mungkin menyelamatkan diri dari pekerjaan.scp -r
memaksa mengikuti symlink.Jawaban:
Coba baris ini:
Jika
command
ada di$PATH
variabel Anda , jika tidak, Anda harus menentukan jalur yang Anda tahu.sumber
-f
akan mengembalikan jalur ke target akhir yang tidak ada, asalkan target tautan menengah ada ... Gunakan-e
untuk menghindari ini, yaitu.-e
akan mengembalikan nol jika target akhir tidak ada.-f
salah denganreadlink: illegal option -- f
di OSX. Menghapusnya berfungsi dengan baik.greadlink
.Di Linux,
readlink
baca konten symlink, danreadlink -f
ikuti symlinks ke symlinks ke symlinks, dll., Sampai ia menemukan sesuatu yang bukan symlink.Ini tidak diperlukan untuk scp: scp selalu mengikuti symlink (selalu menyalin konten file, mengabaikan metadata kecuali yang
-p
mempertahankan waktu dan mode file bila memungkinkan).Jika Anda merasa kecewa dengan metadata scp yang bisa dan tidak bisa dipertahankan, saya sarankan menggunakan rsync. Tanpa opsi, rsync menyalin konten file mengabaikan metadata. Opsi yang biasa digunakan
-a
mempertahankan semua metadata varietas kebun (waktu, tautan simbolik, izin, dan kepemilikan), dan ada opsi untuk melestarikan metadata eksotis seperti ACL dan tautan keras.sumber
Saya menggunakan perintah
ls
,stat
,readlink
.Ambil file
/etc/localtime
sebagai contohOperasi
Menggunakan stat
Menggunakan readlink
Sepertinya perintah
readlink -f
itu lebih baik.Penjelasan
sumber
Stat akan memberi Anda informasi ini:
sumber
Anda bisa melakukannya
atau Anda bisa mendapatkan yang serupa di Linux
Jika Anda menambahkan ini ke skrip, periksa kesalahannya. Jika Anda tidak ingin melihat pesan kesalahan dalam kasus ketika tautan sym tidak ada, lanjutkan dengan sesuatu seperti
sumber
Saya akan menggunakan
realpath <symlink>
.Mungkin yang Anda sebut 'sumber' adalah file 'target' sesuai dengan penggunaan
ln
:Usage: ln [OPTION]... [-T] TARGET LINK_NAME
sumber
readlink
tidak memotongnya ... mac bodoh. lolreadlink -f 'which java'
tidak bekerja untuk saya.Tapi ini berhasil:
sumber
`
tidak'
.. tetapi$()
lebih baik berlatih.$()
ini adalah praktik yang lebih baik.command
, tetapi ini sudah usang. menggunakan $ () lebih baik, karena enkapsulasi $ ($ (perintah)) jauh lebih mudah dan tidak perlu melarikan diri khusus. Maka itu lebih disukai. Pada contoh pertama Anda menggunakan tanda kutip biasa, maka readlink mencoba menemukan file bernama 'yang java' dengan spasi dalam namanya. Tapi maksud Anda adalah perintah panggilan yang dengan argumen java, untuk menemukan jalur executable biner java.Pada MAC OX, "-f" parameter tidak berfungsi, 'readlink' berfungsi tanpa parameter apa pun.
sumber