Cara rsync beberapa folder sumber

34

Saya ingin rsync berbagai sumber dan saya ingin tahu cara terbaik untuk mencapainya.

misalnya

/etc/fstab
/home/user/download

Saya memikirkan 3 solusi:

  • Solusi 1

beberapa panggilan ke rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

con: sulit untuk memiliki stat yang disetujui

  • Solusi 2

buat tobackupfolder yang berisi symlink, dan gunakan -Lopsi

sync -aL /home/user/tobackup bkp

con: konten ke cadangan tidak boleh mengandung symlink

  • Solusi 3

pindahkan file ke dalam cadangan dan buat symlink di lokasi asli

rsync -a /home/user/tobackup bkp

con: beberapa konfigurasi manual

Mana yang Anda rekomendasikan?

Apakah ada cara yang lebih baik?

pengguna1437346
sumber
sumber jarak jauh: stackoverflow.com/questions/15817583/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

33

Anda dapat melewati beberapa argumen sumber.

rsync -a /etc/fstab /home/user/download bkp

Ini menciptakan bkp/fstabdan bkp/download, seperti perintah terpisah yang Anda berikan. Mungkin diinginkan untuk melestarikan struktur sumber sebagai gantinya. Untuk melakukan ini, gunakan /sebagai sumber dan gunakan aturan sertakan-kecualikan untuk menentukan file mana yang akan disalin. Ada dua cara untuk melakukan ini:

  • Secara eksplisit menyertakan setiap file dan juga setiap komponen direktori yang mengarah ke sana, dengan /***di akhir direktori ketika Anda ingin menyalin seluruh pohon direktori:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Sertakan semua direktori tingkat atas dengan /*/(sehingga rsync akan melintasi /etcdan /homeketika mencari file untuk disalin) dan direktori tingkat kedua dengan /*/*/(untuk /home/user), tetapi hapus direktori di mana tidak ada file yang disalin. Ini lebih nyaman karena Anda tidak perlu membuat daftar orang tua secara eksplisit. Anda bahkan dapat menggunakan --prune-empty-dirs --include='*/'alih-alih menghitung jumlah level, tetapi ini tidak praktis di sini karena rsync akan melintasi seluruh sistem file untuk menjelajahi direktori meskipun tidak ada aturan penyertaan yang dapat menandingi apa pun di luar /etcdan /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Bagus, tapi bagaimana menjaga struktur direktori di dalam bkp?
Rodrigo
Maksudku, bkp / etc / fstab dan bkp / home / user / dowlonad? Atau mungkin / bkp / fstab dan bkp / unduh?
Rodrigo
@ Rodrigo Saya sudah mengedit jawaban saya
Gilles 'SO- stop being evil'
13

Saya sangat suka jawaban Gilles, namun, saya ingin menambahkan bahwa dalam pandangan saya persyaratan untuk menyinkronkan beberapa folder sambil mempertahankan struktur direktori paling baik dipenuhi dengan melewati beberapa sumber argumen bersamaan dengan --relativeopsi.

Dalam hal ini, kita dapat memiliki sesuatu sebagai berikut:

rsync -aR /etc/fstab /home/user/download bkp

yang akan menghasilkan bkp/etc/fstabdan bkp/home/user/download.

Bagian terbaik tentang ini adalah bahwa (saya percaya karena rsync v. 2.6.7) pada dasarnya kita dapat mengontrol seberapa banyak struktur direktori yang ingin kita tiru pada receiver.
(Lihat dokumentasi pada --relativeopsi di sini )

Jadi misal jika kita melakukan ini

rsync -aR /home/./user1/download /home/./user2/download bkp

kita akan berakhir dengan bkp/user1/downloaddan bkp/user2/download.

Christoph
sumber
2

Ini juga berfungsi - kurung kurawal, berisi daftar sumber yang dipisahkan koma.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Agak mirip dengan apa yang terjadi ketika Anda memanggil curt kawat gigi sytnax dengan cp dan utilitas tertentu lainnya:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive
Brad Hein
sumber
Bagaimana Anda menentukan port ssh dengan ini? Sintaks itu tampaknya berfungsi ketika menggunakan-e
tcurdt