ป้ายกำกับ: คัดลอก

rsync: (Remote Sync )คัดลอกไฟล์rsync: (Remote Sync )คัดลอกไฟล์

rsync เป็นเครื่องมือที่ทรงพลังมากสำหรับการคัดลอกและซิงค์ไฟล์ ทั้งภายในเครื่องเดียวกันหรือระหว่างเซิร์ฟเวอร์ จุดเด่นของมันคือการส่งเฉพาะส่วนที่เปลี่ยนแปลง ทำให้ประหยัดเวลาและแบนด์วิดท์ครับ


คำสั่งพื้นฐาน

รูปแบบคำสั่งของ rsync จะคล้ายกับ cp ครับ
rsync [options] [ต้นทาง] [ปลายทาง]


Option ที่ใช้บ่อย

ส่วนใหญ่เรามักจะใช้ -avz ร่วมกันครับ

  • -a : คัดลอกแบบรักษาคุณสมบัติเดิมทั้งหมด และรวมไปถึงโฟลเดอร์ย่อย
  • -v : แสดงรายละเอียดว่ากำลังคัดลอกไฟล์ไหนอยู่บ้าง
  • -z : บีบอัดข้อมูลระหว่างส่ง ช่วยให้เร็วขึ้นเมื่อส่งผ่าน network
  • --delete: ลบไฟล์ที่ปลายทาง ถ้าไฟล์นั้นถูกลบไปแล้วจากต้นทาง
  • --dry-run: ลองรันเสมือนจริงเพื่อดูว่าจะเกิดอะไรขึ้นบ้าง แต่ยังไม่คัดลอกจริง

ตัวอย่างการใช้งานจริง


การคัดลอกภายในเครื่อง

rsync -av /path/to/source/ /path/to/destination/

ข้อควรระวัง: > * ถ้าใส่ / หลังชื่อโฟลเดอร์ต้นทาง (เช่น folder/) หมายถึง “คัดลอก ไฟล์ข้างใน โฟลเดอร์นั้น”

  • ถ้าไม่ใส่ / (เช่น folder) หมายถึง “คัดลอก ตัวโฟลเดอร์ นั้นไปด้วย”

การคัดลอกไปยัง Server อื่น

โดยปกติจะส่งผ่าน SSH ซึ่งมีความปลอดภัยสูง
rsync -avz /local/path/ user@remote_host:/remote/path/
การดึงข้อมูลจาก Server กลับมาที่เครื่องเรา
rsync -avz user@remote_host:/remote/path/ /local/path/


เปรียบเทียบความต่างของไฟล์

หากคุณต้องการ เปรียบเทียบความต่างของไฟล์ ระหว่างสองโฟลเดอร์นี้โดย ไม่สนใจเวลาที่แก้ไข แต่เน้นดูที่เนื้อหาหรือโครงสร้างไฟล์ rsync มี Option ที่ตอบโจทย์นี้โดยเฉพาะครับ

คุณสามารถใช้คำสั่ง --dry-run ร่วมกับ Option การเปรียบเทียบดังนี้ครับ


เปรียบเทียบโดยใช้ Checksum

วิธีนี้ rsync จะข้ามการเช็ควันที่และขนาดไฟล์ แต่จะคำนวณค่า Checksum ของเนื้อหาไฟล์แทน ถ้าเนื้อหาเหมือนกันเป๊ะจะถือว่าเป็นไฟล์เดียวกัน
rsync -avnc --delete /Users/Shared/Gits/phunsanit/laravel/ /Users/Shared/Gits/phunsanit/laravel-polarized/

  • -n หรือ --dry-run: สำคัญมาก! เพื่อให้มันแค่ “แสดงความต่าง” ออกมาให้ดู แต่ไม่ไปเขียนทับหรือลบไฟล์จริง ๆ
  • -c หรือ --checksum: บังคับให้เช็คที่เนื้อหาไฟล์ ไม่สนใจเวลา
  • --delete: จะช่วยแสดงให้เห็นว่ามีไฟล์ไหนใน laravel-polarized ที่ไม่มีในต้นทาง

เปรียบเทียบเฉพาะขนาดไฟล์

ถ้าคุณมั่นใจว่าถ้าไฟล์ขนาดเท่ากันคือไฟล์เดียวกัน ให้ใช้ตัวนี้ครับ
rsync -avn --size-only /Users/Shared/Gits/phunsanit/laravel/ /Users/Shared/Gits/phunsanit/laravel-polarized/


ทางเลือกอื่น: ใช้คำสั่ง diff

หากคุณต้องการดูว่า “บรรทัดไหน” ใน Code ที่ต่างกัน ไม่ใช่แค่ดูว่าไฟล์ไหนต่างกัน แนะนำให้ใช้
diffdiff -rq /Users/Shared/Gits/phunsanit/laravel /Users/Shared/Gits/phunsanit/laravel-polarized

  • -r : ดูลึกลงไปในทุกโฟลเดอร์ย่อย
  • -q : สรุปสั้น ๆ แค่ว่าไฟล์ไหน “Differ” หรือ “Only in” โดยไม่พ่นเนื้อหา Code ออกมาทั้งหมด

เคล็ดลับเพิ่มเติม

  • อยากดู Progress: เพิ่ม --progress เข้าไปในคำสั่ง เพื่อดูความเร็วและเวลาที่เหลือ
  • การสำรองข้อมูล : หากคุณกำลังจะแก้ไขไฟล์ระบบอย่าง Nginx หรือ Config สำคัญ การใช้ rsync ทำ Snapshot หรือ Backup ไว้ในโฟลเดอร์อื่นก่อนเป็นเรื่องที่ดีมากครับ เช่น
    rsync -av /etc/nginx/ /etc/nginx_backup_$ (date +%F) /

อ่านเพิ่มเติม