ป้ายกำกับ: zshrc

วิธีย้ายไฟล์ BitTorrent ไปยัง External Drive อัตโนมัติทุกชั่วโมง พร้อมตัดไฟล์ Padding ขยะ ด้วย rsync บน macOSวิธีย้ายไฟล์ BitTorrent ไปยัง External Drive อัตโนมัติทุกชั่วโมง พร้อมตัดไฟล์ Padding ขยะ ด้วย rsync บน macOS

สำหรับใครที่ดาวน์โหลดไฟล์ผ่านโปรแกรม BitTorrent เป็นประจำ มักจะเจอปัญหาพื้นที่จัดเก็บบนเครื่องเต็มอย่างรวดเร็ว ครั้นจะคอยลากไฟล์ไปใส่ External Hard Drive เองตลอดเวลาก็เสียเวลา แถมในหลาย ๆ ครั้ง โปรแกรมโหลดบิทมักจะสร้างไฟล์ขยะที่ขึ้นต้นหรือลงท้ายด้วย _____padding_file_ ขึ้นมาแทรกอยู่ในโฟลเดอร์ ทำให้เปลืองพื้นที่และดูรกตา

บทความนี้จะพามาดูวิธีรันคำสั่ง rsync แบบชั่วคราวผ่าน Terminal เพื่อย้ายไฟล์เฉพาะที่โหลดเสร็จแล้วอัตโนมัติทุก ๆ 1 ชั่วโมง พร้อมตั้งค่า Exclude ไม่ให้ย้ายไฟล์ .part, .torrent และไฟล์ padding ขยะ พร้อมคำสั่งกวาดล้างไฟล์ที่ไม่จำเป็นทิ้งให้อัตโนมัติ


ไฟล์ _____padding_file_ คืออะไร ทำไมถึงโผล่มา?

ไฟล์ที่มีชื่ออย่าง .____padding_file_... เกิดจากคุณสมบัติ Piece Alignment ของโปรแกรม Torrent client บางตัว (เช่น BitComet หรือการตั้งค่าจัด Piece boundary) ซึ่งสร้างไฟล์จำลองขึ้นมาเพื่อเติมเต็มขนาด Piece ของข้อมูลให้ลงตัว แต่สำหรับผู้ใช้งานทั่วไป ไฟล์เหล่านี้คือไฟล์ขยะที่ไม่มีประโยชน์และไม่จำเป็นต้องเก็บไว้


สคริปต์ Loop ทำงานชั่วคราวทุก 1 ชั่วโมง

หากเราต้องการให้คำสั่งทำงานชั่วคราวเฉพาะช่วงที่เปิดเครื่องหรือเปิดหน้าต่างทิ้งไว้ โดยไม่อยากตั้งค่าระบบถาวร (เช่น Cron หรือ Launchd) เราสามารถสั่งวนลูป while true ใน Terminal ได้โดยตรง

while true; do
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting rsync..."

  # 1. ย้ายไฟล์ที่พร้อมใช้งานไปยัง External Drive โดยกรองไฟล์ชั่วคราวและ padding ออก
  rsync -avh --progress --remove-source-files \
    --exclude='*.part' \
    --exclude='*.torrent' \
    --exclude='*_____padding_*' \
    /Users/phunsanit/Downloads/bit/ '/Volumes/My Book/BIT'

  # 2. ลบไฟล์ padding ขยะที่ยังค้างอยู่ในโฟลเดอร์ต้นทาง
  find /Users/phunsanit/Downloads/bit/ -type f -name "*_____padding_*" -delete

  # 3. ลบโฟลเดอร์เปล่าที่เหลือจากการย้ายไฟล์ (โฟลเดอร์ที่ไม่เหลือไฟล์ข้างในแล้ว)
  find /Users/phunsanit/Downloads/bit/ -mindepth 1 -type d -empty -delete

  echo "[$(date '+%Y-%m-%d %H:%M:%S')] Cycle finished. Waiting for 1 hour..."
  sleep 3600
done

อธิบายการทำงานของแต่ละส่วน

  • rsync -avh --progress --remove-source-files: สั่งซิงก์ไฟล์แบบรักษาสิทธิ์/เวลาของไฟล์ พร้อมแสดงความคืบหน้า และเมื่อไฟล์ใดคัดลอกไปยังปลายทางสำเร็จแล้ว จะลบไฟล์ต้นทางนั้นทิ้งทันทีเพื่อคืนพื้นที่
  • --exclude='*_____padding_*': ป้องกันไม่ให้ rsync ดึงไฟล์ที่มีคำว่า _____padding_ ข้ามไปเกะกะบน External Drive
  • find ... -name "*_____padding_*" -delete: จัดการลบไฟล์ padding ที่ยังค้างอยู่ในฝั่งโฟลเดอร์ดาวน์โหลดบนเครื่องทิ้งจริง ๆ
  • find ... -type d -empty -delete: เนื่องจากตัวเลือก --remove-source-files ของ rsync จะลบเฉพาะ “ตัวไฟล์” แต่ไม่ลบโครงสร้างไดเรกทอรี บรรทัดนี้จึงช่วยเก็บกวาดโฟลเดอร์ที่ว่างเปล่าให้หมดจด
  • sleep 3600: หน่วงเวลาการทำงานไว้ 1 ชั่วโมง (3,600 วินาที) ก่อนจะวนกลับไปเริ่มกระบวนการใหม่อีกครั้ง

วิธีหยุดการทำงานเมื่อเสร็จสิ้น

เนื่องจากเป็นสคริปต์ที่รันแบบเบื้องหน้า (Foreground loop) เมื่อต้องการหยุดการทำงานหรือเลิกใช้งานชั่วคราว เพียงแค่กลับไปที่หน้าต่าง Terminal นั้นแล้วกดคีย์ลัด:

Ctrl + C เพื่อยกเลิกลูปและหยุดการทำงานได้ทันที