Pada episode ini kita akan berhenti mengunduh ulang file yang tidak berubah: timestamping dengan -N untuk download incremental, mode If-Modified-Since, serta kebiasaan sopan ke server seperti limit-rate, wait, random-wait, dan waitretry.

Di episode 14 kalian mengamankan kredensial dan memverifikasi setiap file yang masuk. Sekarang giliran pertanyaan efisiensi: apakah kalian masih mengunduh ulang file yang tidak berubah? Kebiasaan ini lebih mahal dari yang kalian kira — bandwidth cloud dibayar per byte, waktu tunggu menumpuk, dan server yang sama dibebani berulang kali untuk data yang identik. Episode 15 mengajarkan wget untuk menjadi lebih cerdas: mengunduh hanya yang berubah, dan melakukannya dengan sopan.
Bayangkan memirror dokumentasi berukuran 2 GB setiap pagi. Hari kedua, 99 persen isinya sama persis dengan kemarin — tapi wget yang dikonfigurasi naif akan mengunduh seluruh 2 GB lagi, membayar bandwidth, membebani server, dan membuang waktu. Di cloud, ini bukan sekadar ketidakefisienan — ini tagihan. Solusinya bernama timestamping.
-NOpsi -N (alias --timestamping) membandingkan tanggal modifikasi lokal dengan tanggal modifikasi yang dilaporkan server:
wget -N https://example.com/data/daily-report.csvLogika kerjanya sederhana dan tegas: jika file lokal sudah sama baru dengan versi server, wget melewatinya. Jalankan lagi perintah yang sama, dan hasilnya:
File 'daily-report.csv' not modified on server. Omitting download.Pada jalankan pertama, semua file diunduh. Pada jalankan kedua, hanya file yang berubah yang menyentuh jaringan. Ini seperti resepsionis yang bertanya "apakah surat ini beda dengan yang kemarin?" sebelum mencetak ulang semuanya.
Important
-N bergantung pada timestamp lokal yang utuh. Jangan mengubah atau menyentuh file hasil mirror dengan tangan — jika timestamp lokal lebih baru dari server, wget menganggap file itu sudah segar dan tidak pernah mengunduh ulang, walau versi server berubah.
-N untuk Update IncrementalKekuatan -N baru terasa saat digabungkan dengan mode rekursif. Alih-alih memirror ulang seluruh situs, wget hanya memperbarui yang berubah:
wget -N -r -np https://docs.example.com/-r untuk rekursif, -np agar tidak naik ke direktori induk, dan -N memastikan hanya file yang berubah yang diunduh ulang. Inilah pola incremental mirror — replika lokal tetap lengkap, tapi biaya perawatan hariannya jauh lebih kecil.
--no-if-modified-sincePada mode -N, wget memakai header If-Modified-Since untuk bertanya ke server: "kirimkan hanya kalau berubah sejak tanggal ini". Server yang patuh menjawab 304 Not Modified dan wget melewatinya. Opsi --no-if-modified-since mengganti strategi ini:
wget -N --no-if-modified-since https://example.com/data/file.binDengan opsi ini wget mengirim request HEAD untuk mengecek tanggal modifikasi terlebih dahulu, baru mengunduh jika benar-benar berubah. Gunakan ketika server mengabaikan header If-Modified-Since — misalnya backend di balik load balancer tanpa state bersama yang menjawab 304 secara salah. Satu request ekstra sebagai imbalan keakuratan.
--limit-rate: Rem KecepatanUnduhan yang memonopoli seluruh bandwidth adalah tetangga yang buruk. Opsi --limit-rate memasang rem:
wget --limit-rate=500k https://cdn.example.com/backup-2026.dbNilai diterima dalam satuan seperti 500k (kilobyte) atau 2m (megabyte). Ini seperti keran air: buka penuh, seluruh rumah kehabisan air; atur sedikit, semua orang tetap mandi. Di jaringan bersama, --limit-rate menjaga download besar tidak membuat orang lain kelaparan — dan di beberapa ISP, justru membuat download besar lebih stabil.
--wait dan --random-wait: Tetangga yang SopanPada mode rekursif, wget beruntun mengirim request ke server yang sama. --wait memasang jeda antar request:
wget -r --wait=5 https://docs.example.com/Ini memberi server ruang bernapas — penting saat memirror situs kecil yang server-nya tidak didesain untuk lonjakan. Namun jeda yang selalu sama bisa terbaca sebagai pola, dan pola mudah diblokir. --random-wait memecahnya:
wget -r --wait=5 --random-wait https://docs.example.com/Jeda menjadi acak dalam rentang tertentu di sekitar nilai --wait. Bayangkan dua tamu: yang satu mengetuk pintu setiap 5 detik persis, yang lain dengan jeda tak menentu — yang kedua jauh lebih tidak mengganggu.
Tip
Kombinasi --wait dan --random-wait bukan hanya etika — ia proteksi. Server yang mendeteksi pola otomatis sering menanggapi dengan 429 Too Many Requests atau blokir IP. Jeda acak membuat wget terlihat seperti pengunjung manusia, bukan crawler yang lepas kendali.
--waitretry: Mundur Bertahap saat GagalKegagalan tidak selalu permanen — server bisa sedang sibuk, dan beberapa detik kemudian pulih. --waitretry memberi wget strategi mundur yang terukur:
wget --waitretry=10 https://example.com/large-file.binSetiap percobaan ulang menunggu lebih lama, hingga batas maksimum yang ditentukan — alih-alih memukul server yang sedang jatuh dengan deras. Ini prinsip backoff yang sama yang dipakai di seluruh industri: jaringan yang cerdas tidak menyerang, ia menunggu dengan sabar.
Rangkai semuanya menjadi satu skrip yang berdiri sendiri — pola untuk mirror yang dirawat setiap malam tanpa pengawasan:
#!/usr/bin/env bash
set -euo pipefail
MIRROR_DIR="$HOME/mirror/docs.example.com"
LOG="$HOME/mirror/mirror.log"
mkdir -p "$MIRROR_DIR"
wget --recursive --no-parent --timestamping \
--directory-prefix="$MIRROR_DIR" \
--limit-rate=500k --wait=2 --random-wait \
--append-output="$LOG" \
https://docs.example.com/
echo "Selesai: $(date -u +%FT%TZ)" >> "$LOG"Bedah logikanya: --timestamping menjamin hanya yang berubah yang diunduh, --limit-rate melindungi jaringan bersama, --wait dengan --random-wait menjaga server tetap nyaman, dan --append-output menulis jejak setiap jalankan ke log yang bisa diaudit. Skrip seperti inilah yang akan kita jadwalkan dengan cron di episode 16.
Episode 15 mengubah wget dari pengunduh naif menjadi pengunduh yang berpikir: timestamping dengan -N untuk melewati file yang tidak berubah, --no-if-modified-since untuk menangani server yang tidak patuh, --limit-rate untuk mengatur kecepatan, --wait dan --random-wait untuk menjadi tetangga yang sopan, serta --waitretry untuk mundur bertahap saat gagal.
Inti yang perlu diingat: efisiensi dan kesopanan adalah dua sisi dari hal yang sama — keduanya mengurangi beban, dan keduanya dihargai baik oleh tagihan cloud maupun oleh server yang kalian akses.
Di episode 16 berikutnya semua keterampilan ini menjadi otomatis: scripting dan automation — exit code, logging, penjadwalan dengan cron, dan integrasi wget di pipeline CI/CD. Sampai jumpa!