คำสั่ง rsync ของ Linux: ตัวเลือก | ตัวอย่างการใช้งาน

ถ้าคัดลอกใหม่ทั้งหมดทุกครั้งเพื่อให้โฟลเดอร์ของเซิร์ฟเวอร์ 2 เครื่องตรงกัน แม้จะมีไฟล์ที่เปลี่ยนเพียงไฟล์เดียว ปริมาณข้อมูลที่ส่งก็ยังเท่ากับขนาดทั้งหมด คำสั่ง rsync ย่อมาจาก remote sync ใช้เปรียบเทียบต้นทางกับปลายทางแล้วส่งเฉพาะไฟล์ที่ต่างกัน และทำงานแบบเดียวกันทั้งระหว่างโฟลเดอร์ในเครื่องและระหว่างเซิร์ฟเวอร์ที่เชื่อมต่อผ่าน SSH บทความนี้สรุปวิธีใช้พื้นฐาน ตัวเลือก และตัวอย่างการเชื่อมต่อ 2 แบบ คือ SSH และ rsync daemon
ผลลัพธ์ในบทความนี้ได้มาจาก rsync 3.2.7 บน AlmaLinux 9.8 ถ้ายังไม่ได้ติดตั้ง ให้ติดตั้งด้วยตัวจัดการแพ็กเกจ
# ตระกูล RHEL
dnf -y install rsync
# ตระกูล Debian
apt -y install rsync✅ วิธีใช้พื้นฐาน
วิธีใช้พื้นฐานมีดังนี้
rsync -ตัวเลือก ต้นทาง ปลายทางคำสั่ง cp กับ rsync ใช้ลำดับเดียวกัน คือเขียนต้นทางก่อนแล้วเขียนปลายทางตามหลัง ถ้าใส่สแลช [/] ต่อท้ายต้นทาง จะมีเพียงเนื้อหาในโฟลเดอร์ที่เข้าไปอยู่ในปลายทาง ถ้าไม่ใส่ จะเข้าไปทั้งโฟลเดอร์
~]# rsync -av www/ backup/
sending incremental file list
index.html
img/
img/logo.png
~]# rsync -av www backup/
sending incremental file list
www/
www/index.html
www/img/
www/img/logo.pngถ้ารันคำสั่งเดิมอีกครั้ง รายการไฟล์จะว่าง และจำนวนไบต์ใน sent จะลดลงเหลือไม่กี่ร้อยไบต์ เพราะไฟล์ที่มีขนาดและเวลาแก้ไขเท่าเดิมจะถูกข้ามไป
~]# rsync -av www/ backup/
sending incremental file list
sent 166 bytes received 13 bytes 358.00 bytes/sec
total size is 3,015 speedup is 16.84ถ้าใช้แค่ -r โดยไม่มี -a เวลาแก้ไขจะไม่ถูกเก็บไว้ การรันครั้งถัดไปจึงส่งไฟล์เดิมซ้ำอีก เวลาซิงค์โฟลเดอร์ให้ใส่ -a ไว้เป็นพื้นฐาน
ตัวเลือก -n จะแสดงเฉพาะไฟล์ที่จะเปลี่ยนโดยไม่ส่งจริง และท้ายผลลัพธ์จะมี [(DRY RUN)] ตัวเลือกที่ลบไฟล์ในปลายทางอย่าง --delete ให้ตรวจด้วย -n ก่อนแล้วจึงรันจริง
~]# rsync -avn --delete www/ backup/
sending incremental file list
deleting old.bak
index.html
sent 188 bytes received 39 bytes 454.00 bytes/sec
total size is 3,013 speedup is 13.27 (DRY RUN)✅ ตัวเลือกคำสั่ง rsync & ตัวจำลอง
| ตัวเลือก | คำอธิบาย | |
|---|---|---|
| -a | --archiveคัดลอกไดเรกทอรีย่อยด้วย และเก็บสิทธิ์·เจ้าของ·เวลาแก้ไข·Symbolic link ไว้ (เหมือนกับ -rlptgoD) | |
| -v | --verboseแสดงชื่อไฟล์ที่ส่งและปริมาณข้อมูลที่ส่ง | |
| -z | --compressบีบอัดข้อมูลไฟล์ระหว่างส่ง | |
| -r | --recursiveคัดลอกไดเรกทอรีย่อยด้วย (รวมอยู่ใน -a) | |
| -t | --timesเก็บเวลาแก้ไขไว้ (รวมอยู่ใน -a) เป็นเกณฑ์ตัดสินว่าไฟล์ใดจะถูกข้ามในการรันครั้งถัดไป | |
| -n | --dry-runแสดงเฉพาะไฟล์ที่จะเปลี่ยนโดยไม่ส่งจริง และแสดง (DRY RUN) ไว้ท้ายผลลัพธ์ | |
| -u | --updateข้ามไฟล์ที่ฝั่งปลายทางใหม่กว่า | |
| -h | --human-readableแสดงจำนวนไบต์เป็นหน่วย K·M·G | |
| -P | เหมือนกับ --partial --progress แสดงความคืบหน้าของแต่ละไฟล์ และส่งต่อจากจุดเดิมเมื่อการส่งถูกขัดจังหวะ | |
| -i | --itemize-changesแสดงรายการที่เปลี่ยนในแต่ละไฟล์เป็นสัญลักษณ์>f+++++++++ ไฟล์ใหม่ · >f.st...... ขนาด·เวลาเปลี่ยน · *deleting ถูกลบ | |
| -e | --rsh=COMMANDกำหนดเชลล์ระยะไกล-e 'ssh -p 2222 -i /root/.ssh/key.pem' | |
| --delete | ลบไฟล์ที่ไม่มีในต้นทางออกจากปลายทาง (ต้องใช้ -r หรือ -a) | |
| --exclude=PATTERN | ยกเว้นไฟล์·ไดเรกทอรีที่ตรงกับแพตเทิร์น--exclude '*.tmp' --exclude 'cache/' | |
| --include=PATTERN | วางไว้หน้า --exclude เพื่อเอาเฉพาะแพตเทิร์นนั้นออกจากการยกเว้น | |
| --max-size=SIZE | ไม่ส่งไฟล์ที่ใหญ่กว่าขนาดที่กำหนด (--min-size ใช้กับไฟล์ที่เล็กกว่า)--max-size=3M --min-size=10k | |
| --bwlimit=RATE | จำกัดความเร็วในการส่ง หน่วยเป็น KiB/s | |
| --stats | แสดงสถิติจำนวนไฟล์·ปริมาณข้อมูลที่ส่ง |
✅ วิธีเชื่อมต่อ: SSH และ rsync daemon
การเชื่อมต่อเพื่อซิงค์กับเซิร์ฟเวอร์ระยะไกลมี 2 แบบ โคลอนตัวเดียว [:] หลังโฮสต์จะเชื่อมต่อผ่าน SSH ส่วนโคลอนสองตัว [::] จะเชื่อมต่อตรงกับ rsync daemon ที่พอร์ต 873
| หมวด | แบบ SSH (:) | แบบ rsync daemon (::) |
|---|---|---|
| รูปแบบการเชื่อมต่อ | rsync -ตัวเลือก user@host:/พาธ /พาธในเครื่อง | rsync -ตัวเลือก host::โมดูล/พาธ /พาธในเครื่อง |
| พอร์ต | พอร์ต SSH (ค่าเริ่มต้น 22) | 873 |
| การเข้ารหัส | เข้ารหัสด้วย SSH | ไม่มีการเข้ารหัส |
| การยืนยันตัวตน | คีย์ SSH หรือรหัสผ่าน | hosts allow ใน rsyncd.conf และบัญชี·รหัสผ่าน (ไม่บังคับ) |
| การตั้งค่าฝั่งเซิร์ฟเวอร์ | ไม่มี (ใช้ได้ทันทีเมื่อเชื่อมต่อ SSH ได้) | ติดตั้ง rsync-daemon, /etc/rsyncd.conf, เปิดพอร์ต 873 |
| การใช้งาน | สำรองข้อมูล·Deploy ระหว่างเซิร์ฟเวอร์ (ทางเลือกหลัก) | ทำมิเรอร์ในเครือข่ายภายในโดยไม่ต้องให้บัญชี SSH |
🔲 แบบ SSH
ถ้าเป็นเซิร์ฟเวอร์ที่เชื่อมต่อด้วย SSH ได้ ก็ใช้ได้ทันทีโดยไม่ต้องตั้งค่าฝั่งเซิร์ฟเวอร์ ถ้าพอร์ตต่างออกไปหรือใช้ไฟล์คีย์ ให้ใส่คำสั่ง ssh ลงในตัวเลือก -e ตามเดิม
# โลคัล → ระยะไกล
rsync -avz /home/2server_data/ root@192.168.45.239:/home/1server_data/
# ระยะไกล → โลคัล
rsync -avz root@192.168.45.239:/home/1server_data/html_Remote /home/2server_data
# กำหนดพอร์ต SSH·ไฟล์คีย์
rsync -avz -e 'ssh -p 2222 -i /root/.ssh/key.pem' root@192.168.45.239:/home/1server_data/ /home/2server_data
ถ้าต้องการยกเว้นไฟล์หรือไดเรกทอรีบางรายการ ให้ใส่ --exclude ทีละแพตเทิร์น หรือรวมแพตเทิร์นไว้ในวงเล็บปีกกาแล้วเขียนครั้งเดียว
rsync -avz --exclude 'html_Remote_Excertion' --exclude 'Exception_File' root@192.168.45.239:/home/1server_data/ /home/2server_data
rsync -avz --exclude={'html_Remote_excertion/*','Exception_File'} root@192.168.45.239:/home/1server_data/ /home/2server_data
🔲 แบบ rsync daemon
rsync daemon อนุญาตให้เข้าถึงเป็นรายโมดูลผ่านพอร์ต 873 โดยไม่ต้องมีบัญชี SSH และเนื่องจากการสื่อสารไม่ถูกเข้ารหัส จึงใช้ระหว่างเซิร์ฟเวอร์ในเครือข่ายภายในเดียวกัน
บน AlmaLinux 9 ให้ติดตั้งแพ็กเกจ rsync-daemon แล้วเปิดบริการ ถ้าเซิร์ฟเวอร์ใช้ firewalld ให้เปิดพอร์ต 873 ส่วนคลาวด์เซิร์ฟเวอร์ให้เปิดที่ไฟร์วอลล์ในคอนโซล วิธี xinetd ที่ใช้บน RHEL 8 ลงไปไม่มีแล้วในเวอร์ชัน 9
dnf -y install rsync-daemon
systemctl enable --now rsyncd
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reloadใส่ชื่อโมดูล พาธ และโฮสต์ที่อนุญาตลงในไฟล์ตั้งค่า [/etc/rsyncd.conf] ถ้าตั้ง read only เป็น yes ฝั่งระยะไกลจะดึงไฟล์ไปได้อย่างเดียว
[myhome]
path = /home
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 192.168.45.182
max connections = 3
timeout = 30จากฝั่งระยะไกล ถ้าใส่แค่โคลอนสองตัวหลังโฮสต์ จะแสดงรายการโมดูล ถ้าใส่ชื่อโมดูลด้วย จะแสดงรายการไฟล์ในโมดูลนั้น
~]# rsync 192.168.45.239::
myhome
home
~]# rsync 192.168.45.239::myhome
drwxr-xr-x 4,096 2025/06/12 22:14:39 .
drwxr-xr-x 4,096 2025/06/12 22:21:10 1server_data
drwxr-xr-x 4,096 2025/06/12 22:14:39 2server_dataการคัดลอกใช้รูปแบบ [โฮสต์::โมดูล/พาธ] --delete จะลบไฟล์ที่ไม่มีในต้นทางออกจากปลายทาง และ --include จะเอาเฉพาะรายการที่วางไว้หน้า --exclude ออกจากการยกเว้น
~]# rsync -avz 192.168.45.239::myhome/1server_data/ /home/2server_data/
receiving incremental file list
./
Exception_File
html_Remote/
html_Remote_Excertion/
sent 58 bytes received 332 bytes 780.00 bytes/sec
total size is 442 speedup is 1.13
~]# rsync -avz --delete 192.168.45.239::myhome/1server_data/ /home/2server_data/
~]# rsync -avz --include '*.html' --exclude 'exclude.txt' 192.168.45.239::myhome/1server_data/ /home/2server_data/

บนเซิร์ฟเวอร์ที่เปิด SELinux ไว้ การเข้าถึงพาธของโมดูลอาจถูกบล็อกด้วย [Permission denied (13)] ในการทดสอบ ผ่านได้หลังปิด SELinux ด้วย [setenforce 0]
~]# rsync -avz 192.168.45.239::myhome/1server_data/ /home/2server_data/
receiving incremental file list
rsync: change_dir "/1server_data" (in myhome) failed: Permission denied (13)
sent 8 bytes received 90 bytes 65.33 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see ก่อนหน้า errors) (code 23) at main.c(1658) [Receiver=3.1.2]--bwlimit จำกัดความเร็วในการส่งเป็นหน่วย KiB/s และถ้าใส่ -P จะเห็นความคืบหน้าของแต่ละไฟล์ไปด้วย --max-size และ --min-size จะส่งเฉพาะไฟล์ที่อยู่ในช่วงขนาดที่กำหนด
rsync -avzP --bwlimit=100 192.168.45.239::myhome/1server_data/ /home/2server_data/
rsync -avz --max-size='3M' --min-size='10k' 192.168.45.239::myhome/1server_data/ /home/2server_data/
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน