Chapter sebelumnya memakai rsync sebagai mesin delta tanpa membedahnya; sekarang giliran mesinnya yang naik ke meja operasi. rsync adalah alat sinkronisasi yang hanya memindahkan beda antara sumber dan tujuan, sehingga backup kedua dan seterusnya jauh lebih ringan daripada menyalin ulang seluruh pohon direktori. Kita akan membaca cara kerja delta-transfer, membedah huruf-huruf --itemize-changes, menaklukkan jebakan garis miring, lalu menguji --delete yang menjadikan tujuan cermin sempurna dari sumber.

Cara Kerja Delta-Transfer #

Masalahnya sederhana: cp selalu menyalin seluruh file, dan scp di jaringan melakukan hal yang sama. Untuk file sebesar ratusan megabyte yang hanya berubah beberapa kilobyte, memindahkan semuanya adalah pemborosan. rsync menyelesaikannya lewat algoritma delta-transfer: kedua sisi membagi file menjadi blok-blok, menghitung checksum untuk setiap blok, membandingkan daftar checksum tersebut, lalu hanya blok yang berbeda yang dikirim. Sisi penerima merakit file baru dari blok lama yang masih sama plus blok baru yang dikirim — hasil akhirnya identik dengan salinan penuh, tetapi yang lewat jaringan (atau antar-folder lokal) hanya sebagian kecil.

Konsekuensinya penting dipahami: sinkronisasi pertama tetap menyalin semuanya karena belum ada apa pun di tujuan, sedangkan sinkronisasi berikutnya hanya memindahkan perubahan. Perilaku inilah yang membuat backup harian dengan rsync terasa hampir instan. Untuk transfer jarak jauh, rsync menumpang pada SSH:

bash
rsync -a proyek/ budi@server-kantor:/srv/backup/proyek/
rsync -a --delete -e ssh foto/ [email protected]:/srv/backup/foto/

Sintaksisnya sama persis dengan versi lokal — cukup tulis tujuan sebagai user@host:path. Sinkronisasi pertama mengirim pohon penuh lewat SSH, dan pemanggilan berikutnya hanya mengirim delta. Lingkungan latihan kita tidak memiliki SSH server, jadi seluruh praktik chapter ini menggunakan dua folder lokal; prinsipnya tidak berubah karena delta-transfer bekerja pada pasangan sumber-tujuan mana pun.

Membaca Keputusan rsync dengan –itemize-changes #

Opsi --itemize-changes (ringkas: -i) mencetak satu baris per item yang menegaskan keputusan rsync: dibuat, diperbarui, atau dihapus. Mari kita buktikan bahwa delta itu nyata — buat fixture tiga file, sinkronkan, ubah satu, lalu sinkronkan lagi. Waktu file yang direvisi dikunci dengan touch -d agar huruf yang muncul konsisten antar eksekusi:

bash
mkdir -p proyek/src proyek/docs
printf 'readme proyek\n' > proyek/README.md
printf 'int main(){return 0;}\n' > proyek/src/main.c
printf 'catatan desain\n' > proyek/docs/desain.txt
touch -d "2026-01-15 09:00:00" proyek proyek/src proyek/docs
echo "== sinkronisasi pertama =="
rsync -a --itemize-changes proyek/ cadangan/
echo "== ubah satu file, sinkron ulang =="
printf 'readme proyek (revisi)\n' > proyek/README.md
touch -d "2026-01-15 10:00:00" proyek/README.md proyek
rsync -a --itemize-changes proyek/ cadangan/
diff -r proyek cadangan && echo "pohon identik"

Output yang Dihasilkan:

text
== sinkronisasi pertama ==
created directory cadangan
cd+++++++++ ./
>f+++++++++ README.md
cd+++++++++ docs/
>f+++++++++ docs/desain.txt
cd+++++++++ src/
>f+++++++++ src/main.c
== ubah satu file, sinkron ulang ==
.d..t...... ./
>f.st...... README.md
pohon identik

Bedah baris per barisnya:

  1. Baris 1-5: menyiapkan pohon proyek berisi dua subfolder dan tiga file sebagai data sumber; touch -d menyetel waktu direktori ke nilai tetap.
  2. Baris 8 (rsync -a -i proyek/ cadangan/): mode -a (archive) menyalin rekursif sambil mempertahankan izin, waktu modifikasi, kepemilikan, dan symlink — mode yang hampir selalu tepat untuk backup.
  3. Baris 10-12: satu file direvisi, waktunya dikunci ke pukul 10:00, waktu direktori induk dikembalikan ke 09:00, lalu rsync dijalankan ulang dengan opsi yang sama.
  4. Baris 13 (diff -r): membuktikan hasil sinkronisasi identik dengan sumber, termasuk isi subfolder.

Pada putaran pertama semua item bertanda cd+++++++++ (direktori baru) dan >f+++++++++ (file baru) — memang semua belum ada di tujuan. Pada putaran kedua satu-satunya baris adalah >f.st...... README.md: huruf s berarti ukuran berubah dan huruf t berarti waktu modifikasi berubah, jadi hanya file itulah yang ditransfer. File yang tidak berubah tidak dianggap sama sekali — inilah delta-transfer pada tingkat item. Kamus lengkap huruf-huruf ini terdokumentasi di rsync(1) .

Jebakan Garis Miring di Ujung Sumber #

Satu karakter bisa mengubah hasil total: garis miring pada akhir path sumber. Aturannya — surat/ berarti “salin isi folder”, surat berarti “salin folder-nya”:

bash
mkdir -p surat/2026
printf 'surat resmi\n' > surat/2026/resmi.txt
rsync -a surat/ salin-isinya/
rsync -a surat salin-foldernya/
find salin-isinya salin-foldernya -type f | sort

Output yang Dihasilkan:

text
salin-foldernya/surat/2026/resmi.txt
salin-isinya/2026/resmi.txt

Bedah baris per barisnya:

  1. Baris 3 (rsync -a surat/ salin-isinya/): garis miring di ujung surat/ membuat isi folder langsung mendarat di akar salin-isinya/.
  2. Baris 4 (rsync -a surat salin-foldernya/): tanpa garis miring, folder surat itu sendiri yang disalin ke dalam salin-foldernya/ sehingga strukturnya lebih dalam satu tingkat.
  3. Baris 5 (find ... | sort): memajang hasil keduanya berdampingan agar bedanya terlihat dalam dua baris.

Sinkronisasi Penuh dengan –delete #

Tanpa opsi tambahan, rsync bersifat akumulatif: file yang dihapus dari sumber tetap tinggal di tujuan. Opsi --delete mengubahnya menjadi cermin sempurna — dan karena sifatnya merusak, biasakan mengawalinya dengan --dry-run (-n) yang mensimulasikan tanpa mengeksekusi:

bash
mkdir -p foto
printf 'liburan 1\n' > foto/liburan.txt
printf 'kantor 1\n' > foto/kantor.txt
rsync -a foto/ mirror/
rm foto/kantor.txt
touch -d "2026-01-15 10:00:00" foto
echo "== dry-run =="
rsync -a --delete --itemize-changes --dry-run foto/ mirror/
echo "== eksekusi sungguhan =="
rsync -a --delete --itemize-changes foto/ mirror/
diff -r foto mirror && echo "mirror identik dengan sumber"

Output yang Dihasilkan:

text
== dry-run ==
*deleting   kantor.txt
.d..t...... ./
== eksekusi sungguhan ==
*deleting   kantor.txt
.d..t...... ./
mirror identik dengan sumber

Bedah baris per barisnya:

  1. Baris 1-4: membuat dua foto, mensinkronkan pertama kali ke mirror/, lalu menghapus satu file dari sumber — kejadian yang ingin tercermin.
  2. Baris 6 (touch -d): mengunci waktu direktori foto ke pukul 10:00 — menghapus isi folder memang menyentuh waktu foldernya, dan nilai tetap membuat output latihan konsisten.
  3. Baris 8 (--dry-run): menjalankan simulasi penuh; *deleting memberi tahu file yang akan dihapus, sedangkan .d..t mencatat waktu direktori yang akan diperbarui.
  4. Baris 10: eksekusi sungguhan tanpa --dry-run — kali ini kantor.txt benar-benar dihapus dari mirror/.
  5. Baris 11 (diff -r): bukti akhir bahwa tujuan kini cermin persis dari sumber.

Urutan keduanya bukan formalitas: output *deleting pada dry-run adalah kesempatan terakhir membatalkan sebelum penghapusan permanen terjadi. Pola ini — simulasi dulu, eksekusi kemudian — berlaku untuk semua perintah --delete apa pun sasarannya.

Menyaring dengan –exclude #

Data kerja nyata berisi file yang tidak layak dibackup: sisa editor, file sementara, artefak build. Opsi --exclude menerima pola glob dan melewatinya:

bash
mkdir -p kerja
printf 'laporan final\n' > kerja/laporan.txt
printf 'sisa editor\n' > kerja/draft.tmp
printf 'kunci vscode\n' > kerja/.~lock.tmp
rsync -a --exclude='*.tmp' --itemize-changes kerja/ salinan/
find salinan -type f | sort

Output yang Dihasilkan:

text
created directory salinan
cd+++++++++ ./
>f+++++++++ laporan.txt
salinan/laporan.txt

Bedah baris per barisnya:

  1. Baris 1-4: membuat folder kerja dengan satu file penting dan dua file sampah berakhiran .tmp.
  2. Baris 5: pola *.tmp menyaring kedua file sampah — perhatikan bahwa pola cocok pada nama file di kedalaman mana pun.
  3. Baris 6 (find salinan -type f): membuktikan hanya laporan.txt yang berpindah.

Opsi --exclude boleh diulang untuk beberapa pola, dan --exclude-from=file-daftar.txt membaca pola dari file — nyaman untuk daftar pengecualian panjang yang sama dipakai banyak script. Pola yang diawali / diikat ke akar transfer, misalnya --exclude=/cache hanya menyaring folder cache di paling atas. Lebih banyak resep penyaringan dirangkum di wiki Arch tentang rsync .

rsync kini kita kuasai hingga ke detail itemize-nya: delta-transfer menjaga salinan selalu mengikuti keadaan terkini sumber. Tetapi backup juga butuh kebalikannya — membekukan keadaan pada satu titik waktu agar kemarin tetap bisa diakses meski hari ini berubah. Alat klasiknya adalah tar, topik chapter berikutnya.