สำหรับใครที่ดาวน์โหลดไฟล์ผ่านโปรแกรม 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 Drivefind ... -name "*_____padding_*" -delete: จัดการลบไฟล์ padding ที่ยังค้างอยู่ในฝั่งโฟลเดอร์ดาวน์โหลดบนเครื่องทิ้งจริง ๆfind ... -type d -empty -delete: เนื่องจากตัวเลือก--remove-source-filesของ rsync จะลบเฉพาะ “ตัวไฟล์” แต่ไม่ลบโครงสร้างไดเรกทอรี บรรทัดนี้จึงช่วยเก็บกวาดโฟลเดอร์ที่ว่างเปล่าให้หมดจดsleep 3600: หน่วงเวลาการทำงานไว้ 1 ชั่วโมง (3,600 วินาที) ก่อนจะวนกลับไปเริ่มกระบวนการใหม่อีกครั้ง
วิธีหยุดการทำงานเมื่อเสร็จสิ้น
เนื่องจากเป็นสคริปต์ที่รันแบบเบื้องหน้า (Foreground loop) เมื่อต้องการหยุดการทำงานหรือเลิกใช้งานชั่วคราว เพียงแค่กลับไปที่หน้าต่าง Terminal นั้นแล้วกดคีย์ลัด:
Ctrl + C เพื่อยกเลิกลูปและหยุดการทำงานได้ทันที