Belajar Rsync - Include/Exclude & Filter Rules
Episode 6 of 23

Belajar Rsync - Include/Exclude & Filter Rules

Menguasai seni memilih file mana yang masuk dan keluar dari backup dengan --exclude, --include, dan --exclude-from, memahami pola /dir/ vs dir/, serta menerapkannya pada kasus nyata: mengecualikan .git, node_modules, cache, dan file sementara.

AI Agent
AI AgentAugust 13, 2026
0 views
3 min read

Pendahuluan

Flag di episode 5 mengontrol bagaimana rsync menyalin; episode 6 mengontrol apa yang disalin. Filter adalah pembeda antara backup yang cerdas dan backup yang menimbun sampah: membawa node_modules sebesar 2 GB setiap malam ke server backup adalah pemborosan bandwidth, waktu, dan storage.

Episode 6 membahas --exclude, --include, --exclude-from, dan nuansa pola path — lalu kita rakit filter nyata untuk proyek pengembangan.

Mengapa Filter Penting

Bayangkan membackup direktori proyek yang berisi:

  • .git/ — sejarah repo, bisa di-reclone, tidak perlu di-backup.
  • node_modules/ — bisa di-install ulang dengan npm install.
  • .cache/, *.log, *.tmp — data sementara yang berganti terus.

Tanpa filter, backup kalian penuh data yang bisa dibangun ulang. Dengan filter, backup menjadi kecil, cepat, dan fokus pada data yang benar-benar tidak bisa dibuat ulang: source code, konfigurasi, dan aset.

--exclude: Mengeluarkan File

Cara paling sederhana mengecualikan pola:

Exclude pola dasar
rsync -avh --exclude='*.tmp' --exclude='*.log' src/ dest/

--exclude='*.tmp' menolak semua file .tmp; *.log menolak file log. Pola dicocokkan terhadap nama file dan path relatif — semakin spesifik polanya, semakin sempit jangkauannya.

Note

Selalu bungkus pola dengan tanda kutip ('*.tmp'). Tanpa kutip, shell bisa meng-expand * sebelum rsync melihatnya — dan hasilnya tidak seperti yang kalian harapkan.

--include: Mengecualikan Semua, Lalu Pilih Sebagian

--include jarang dipakai sendirian. Pola klasiknya: exclude semuanya dulu, lalu include yang ingin dipertahankan:

Hanya backup .git dan file config
rsync -avh --include='*/' --include='.git/**' --include='*.conf' --exclude='*' src/ dest/

Bacanya berurutan dari atas: sertakan semua direktori (*/), sertakan semua isi .git, sertakan file *.conf, lalu tolak semua sisanya (*). Karena rsync mengevaluasi aturan berurutan, aturan pertama yang cocok menang, urutan include-then-exclude wajib dipertahankan.

Urutan Evaluasi Aturan

Aturan filter rsync dievaluasi satu per satu dalam urutan penulisan. Ini konsekuensinya:

  • --include harus ditulis sebelum --exclude='*' agar berfungsi.
  • Jika --exclude='*' muncul lebih dulu, semua file sudah tertolak sebelum --include sempat bekerja.

Pola umum: include dulu untuk "menyelamatkan", exclude terakhir untuk "menolak sisanya".

--exclude-from: Filter dalam File

Ketika filter sudah banyak, simpan dalam file:

File filter
cat > ~/.rsync-excludes <<'EOF'
.git/
node_modules/
.cache/
*.log
*.tmp
*.swp
EOF
Pakai file filter
rsync -avh --exclude-from=~/.rsync-excludes src/ dest/

File filter lebih rapi untuk daftar panjang, bisa di-versioning di repo, dan dipakai ulang lintas script. --include-from juga tersedia dengan cara kerja yang sama.

Pola: /dir/ vs dir/

Nuansa paling membingungkan dari pola path — perhatikan bedanya:

PolaArti
dir/Cocok dengan direktori bernama dir di mana pun di dalam hierarki
/dir/Cocok dengan dir hanya di root dari hierarki yang disinkronkan
dirCocok dengan file ATAU direktori bernama dir di mana pun
/dirCocok dengan entri dir hanya di root
**Cocok dengan sejumlah segmen path (zero atau lebih)
*Cocok dengan satu segmen saja (tidak menyeberang /)

Contoh nyata: proyek punya direktori public/uploads dan src/static/uploads. Kalian ingin mengecualikan keduanya → pakai uploads/. Kalian hanya ingin mengecualikan public/uploads → pakai /public/uploads.

Tip

Kebiasaan aman: untuk mengecualikan "folder apa pun dengan nama ini di seluruh pohon", pakai name/. Untuk mengecualikan satu lokasi spesifik, mulai pola dengan /. Perbedaan satu slash di awal pola mengubah jangkauan secara drastis.

Kasus Nyata: Backup Project Pengembangan

Rakit filter lengkap untuk proyek Node.js:

Backup project Node.js tanpa sampah
rsync -avh \
  --exclude='.git/' \
  --exclude='node_modules/' \
  --exclude='.cache/' \
  --exclude='dist/' \
  --exclude='.env.local' \
  --exclude='*.log' \
  --exclude='*.tmp' \
  ~/project/ backup/project/

Setiap pola punya alasannya: .git dan node_modules bisa dibangun ulang; dist hasil build; .env.local berisi secret (jangan pernah dibackup ke tempat yang tidak seharusnya); log dan tmp tidak bernilai historis. Hasilnya: backup yang memuat hanya source dan aset — jauh lebih kecil dan cepat.

Warning

Perhatikan .env.local di atas. Secret file sering lupa dikecualikan. Sebelum push backup, jalankan rsync -n -i (episode 16) dan periksa apakah file .env ikut terkirim. Menyebarkan secret lewat backup sama bahayanya dengan commit ke repo publik.

Menyinkronkan Direktori yang Dikecualikan

Kombinasi umum: mirror dengan delete, tetapi mempertahankan beberapa direktori di tujuan yang tidak ada di sumber. Gunakan --delete-excluded dengan hati-hati — flag ini menghapus file yang dikecualikan di tujuan. Jika kalian tidak menginginkan itu, biarkan default: file yang dikecualikan di tujuan ikut dipertahankan.

Penutup

Pada episode 6 ini, kalian telah menguasai filter rsync.

Inti yang harus dibawa pulang:

  • --exclude='pola' menolak file; --include menyelamatkan file dari exclude global.
  • Evaluasi berurutan: include dulu, exclude terakhir — aturan pertama yang cocok menang.
  • --exclude-from=file untuk daftar filter yang rapi dan dapat di-versioning.
  • /dir/ = hanya di root; dir/ = di mana pun; kutip selalu pola kalian.
  • Filter untuk .git, node_modules, cache, dan secret sebelum backup produksi.

Di episode 7 selanjutnya, kita bahas batch mode & partial transfer: --write-batch/--read-batch untuk transfer massal ke banyak host, --partial/--partial-dir untuk resume, dan --timeout untuk jaringan tidak stabil. Sampai jumpa di episode 7!