Salin symlink DAN di mana ia menunjuk menggunakan rsync

11

Itu tidak perlu dilakukan rsync, tapi alangkah baiknya tidak harus menulis skrip untuk melakukan ini, dan rsyncsangat dekat dengan apa yang saya inginkan.

rsync -a(atau -l) dapat menyimpan symlink, dan -Ldapat men-decereferensi symlink dan menyalinnya seolah-olah itu adalah file / dir yang normal. Namun, mungkinkah menyimpan symlink, dan juga menyalin file / direktori yang ditunjuk oleh tautan?

Ini sebuah contoh. Katakanlah kita memiliki hierarki folder ini:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

dan ketika saya melakukannya rsync -aR dirA dest(atau sesuatu yang lain), saya ingin memiliki persis ini muncul di dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

Apakah ini mungkin rsync? Terima kasih.

Mari kita asumsikan symlink yang memiliki path absolut atau menunjuk ke luar direktori sumber dapat diabaikan.

Wei-Yin
sumber
1
Saya pikir permintaan Anda tidak ditentukan: Anda mensyaratkan jika dirA/linksymlink adalah ../dirB/file, maka ini harus ditangani sebagai menyalin dirB/fileke dest/dirB/filedan dirA/linkke dest/dirA/link. Bagaimana jika dirA/linkada tautan ke ../../another_file? Apa yang terjadi, secara umum, jika dirA/linkmenunjuk ke direktori yang lebih tinggi di pohon direktori?
Riccardo Murri
Tangkapan yang bagus. Dalam kasus penggunaan saya, tidak ada titik tautan ke luar pohon, dan tidak ada jalur absolut di tautan.
Wei-Yin
1
Semakin saya memikirkannya, semakin saya pikir tidak ada utilitas standar yang akan melakukan ini. Dalam kasus umum, mungkin perlu membuat sejumlah besar tujuan diberikan satu sumber, jika Anda memiliki symlink ke symlink atau lebih umum symlink yang target mengandung symlink (misalnya a -> b, b -> c/foo, c -> d/e: permintaan untuk copy ajuga harus menyalin b, c, c/foo, d, d/edan d/e/foo).
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: Ya, Anda benar. Tautan pelacakan dapat menyebabkan memasukkan banyak file, asalkan masih di dalam direktori sumber.
Wei-Yin

Jawaban:

2

Jika Anda tahu nama symlink dan ingin mentransfer tautan dan target Anda dapat:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

rsyncTransfer pertama hanya symlink. Perintah kedua menemukan nama direktori asli, dan yang kedua rsyncmentransfer konten direktori.

pengguna201564
sumber
0

Ini akan mungkin jika dan hanya jika Anda semua berada di 'mydir' dan Anda harus rsync 'mydir' dari satu tempat ke tempat lain. Rsync tidak dapat menyalin di luar jalur yang Anda berikan (dengan pengecualian tautan berikut). misalnya

mydir/dirA ...
mydir/dirB ...
...
xenoterracide
sumber
Ya, asumsi ini sesuai dengan kasus penggunaan saya. Semua tautan ada di dalam mydir.
Wei-Yin
@ Wei-Yin lalu katakan saja untuk tidak mengikuti symlinks ... atau saya salah paham sesuatu
xenoterracide
@ xenoterracide: Tidak peduli bagaimana Anda menjalankan rsync, saya pikir itu akan membuat tujuan tunggal untuk setiap sumber (selain penciptaan direktori terkemuka). Tetapi Wei-Yin ingin membuat dua atau lebih tujuan: tautan, dan sasarannya.
Gilles 'SANGAT berhenti menjadi jahat'
rupanya saya bingung ...
xenoterracide
@Gilles: tidak ada kebutuhan untuk rsync untuk mengikuti symlink, karena akan sync target pula . Jadi itu pertama-tama menyalin symlink, membuat symlink yang menjuntai. Kemudian akan menyalin semua yang lain di direktori, termasuk target symlink. Voila, semuanya cocok dengan baik.
Martin v. Löwis