Bagaimana cara rsync direktori ke direktori baru dengan nama yang berbeda?

49

Saya sedang melakukan transfer data, sistem file lama sangat bergantung pada direktori yang sekarang berada di jalur yang berbeda. Ini adalah direktori git yang menyimpan kode online. Saya tidak punya hak untuk memindahkan atau mengganti namanya.

Jadi yang bisa saya lakukan adalah rsync direktori ini ke jalur lama yang sama. Tetapi nama direktori juga berubah.

Apakah ada cara mudah yang bisa saya rsync direktori ke direktori target dengan nama yang berbeda?

Zen
sumber

Jawaban:

83

Jika Anda ingin menggunakan rsyncsecara rekursif, buat destdirektori itu salinan persis srcdirektori:

rsync -a src/ dest

The rsyncman page menjelaskan bagaimana ini bekerja:

Garis miring pada sumber [...] hindari [s] membuat level direktori tambahan di tujuan. Anda dapat menganggap trailing /pada sumber sebagai makna "salin isi direktori ini" sebagai kebalikan dari "salin direktori dengan nama" [...]

Adrian
sumber
3
Ini akan membuat srcdirektori di bawah destdirektori
Zen
7
@ Zen, tidak dalam versi apa pun yang rsyncpernah saya gunakan. Jika itu benar-benar terjadi pada Anda, Anda kehilangan garis miring di akhir argumen direktori sumber.
Adrian
3
Slash trailing licik itu KUNCI ...
tutuca
sayangnya ini tampaknya tidak bekerja jika destadalah symlnk untuk src, itu bukan berakhir menyalin srcke src/src. Diuji pada macOS. Berharap saya bisa mengganti bar -> foo/dengan bar/, tetapi harus menggunakan direktori sementara antara.
user5359531
@ user5359531 Jika Anda tahu itu destadalah symlink src, cukup rm destsebelum menjalankan perintah di atas. rsynccukup cerdas untuk dibuat destsebelum menyalin konten src. Anda tidak perlu direktori suhu menengah.
Adrian
1

Jika filesystem lama dan baru keduanya dapat diakses oleh mesin Anda, maka pertimbangkan untuk menggunakan tautan simbolik alih-alih rsync. Jika perintah rsync Anda yang Anda gunakan tidak menentukan host (atau jika mereka adalah host yang sama), maka ini masalahnya. Anda mencoba untuk mencerminkan dua direktori dengan nama berbeda di host yang sama. Jangan gunakan rsync untuk ini, karena Anda menduplikasi data, dan Anda harus sering menjalankan rsync agar tetap sinkron.

Menggunakan tautan simbolik adalah perbaikan satu kali yang akan mencerminkan dua direktori (dengan nama yang berbeda) dan hampir tidak memerlukan ruang. Ini seperti membuat direktori alias yang menunjuk ke direktori lain.

Katakanlah Anda memiliki git lama di direktori bernama / old / path / old_git dan sekarang repositori kode telah dipindahkan ke / new / path / new_git

Anda dapat melakukan:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Ini akan membuat tautan seperti itu:

/ old / path / old_git -> / new / path / new_git

Sehingga segala sesuatu yang dimasukkan ke dalam new_git akan segera tersedia dengan cara lama juga, tanpa duplikasi data, dan tanpa harus terus menyinkronkannya.

jrel
sumber
1
Hati-hati dengan perintah rm -rf old_git. Ini akan menghapus seluruh repositori old_git Anda. Jika saya tidak memahami masalah Anda dengan benar, ini bisa menjadi hal yang buruk.
jrel
0

Saya menemukan solusi alternatif sekarang.

Menggunakan rysnc -r /origin/* /target/dapat menyinkronkan semua konten dari direktori asal ke direktori target.

Zen
sumber
8
Saya percaya ini tidak termasuk file dot (.foo) karena ini tidak akan dicocokkan dengan tanda bintang
Ray Burgemeestre
yang bergantung pada ekspansi glob shell, secara teknis ia akan melewatkan setiap file yang ditemukan di sana sebagai argumen untuk rsync. hampir sama dengan berlari rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Seperti yang ditunjukkan oleh @RayBurgemeestre, ekspansi shell glob tidak akan menyertakan file dot.
Florian Castellane