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.

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.
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.
Cara paling sederhana mengecualikan pola:
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 jarang dipakai sendirian. Pola klasiknya: exclude semuanya dulu, lalu include yang ingin dipertahankan:
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.
Aturan filter rsync dievaluasi satu per satu dalam urutan penulisan. Ini konsekuensinya:
--include harus ditulis sebelum --exclude='*' agar berfungsi.--exclude='*' muncul lebih dulu, semua file sudah tertolak sebelum --include sempat bekerja.Pola umum: include dulu untuk "menyelamatkan", exclude terakhir untuk "menolak sisanya".
Ketika filter sudah banyak, simpan dalam file:
cat > ~/.rsync-excludes <<'EOF'
.git/
node_modules/
.cache/
*.log
*.tmp
*.swp
EOFrsync -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.
Nuansa paling membingungkan dari pola path — perhatikan bedanya:
| Pola | Arti |
|---|---|
dir/ | Cocok dengan direktori bernama dir di mana pun di dalam hierarki |
/dir/ | Cocok dengan dir hanya di root dari hierarki yang disinkronkan |
dir | Cocok dengan file ATAU direktori bernama dir di mana pun |
/dir | Cocok 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.
Rakit filter lengkap untuk proyek Node.js:
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.
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.
Pada episode 6 ini, kalian telah menguasai filter rsync.
Inti yang harus dibawa pulang:
--exclude='pola' menolak file; --include menyelamatkan file dari exclude global.--exclude-from=file untuk daftar filter yang rapi dan dapat di-versioning./dir/ = hanya di root; dir/ = di mana pun; kutip selalu pola kalian..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!