หมวดหมู่: Shell Script

Shell Script

วิธีย้ายไฟล์ 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 เพื่อยกเลิกลูปและหยุดการทำงานได้ทันที