การใช้ลูป while true บน Bash/Zsh ใน Terminal ช่วยให้คุณรันคำสั่งซ้ำไปเรื่อย ๆ โดยอัตโนมัติ เหมาะสำหรับการเฝ้าดูโฟลเดอร์ (Watch Directory) เพื่อจัดการไฟล์ทันทีที่มีไฟล์ใหม่เข้ามา
โครงสร้างคำสั่งพื้นฐาน
รูปแบบคำสั่งบรรทัดเดียว (One-liner) ที่พิมพ์ใน Terminal
while true; do mv ~/Downloads/* ~/Archive/ 2>/dev/null; sleep 5; done
หากเขียนเป็น Shell Script (move_files.sh)
#!/bin/bash
SOURCE_DIR="$HOME/Downloads"
TARGET_DIR="$HOME/Archive"
# สร้างโฟลเดอร์ปลายทางหากยังไม่มี
mkdir -p "$TARGET_DIR"
while true; do
# ตรวจสอบว่ามีไฟล์อยู่ในโฟลเดอร์หรือไม่ก่อนย้าย
if compgen -G "$SOURCE_DIR/*" > /dev/null; then
mv "$SOURCE_DIR"/* "$TARGET_DIR"/
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ย้ายไฟล์เรียบร้อยแล้ว"
fi
# หน่วงเวลา 5 วินาทีก่อนวนรอบถัดไป
sleep 5
done
เจาะลึกการทำงานแต่ละส่วน
while true; do ... done: กำหนดเงื่อนไขที่เป็นจริงเสมอ ลูปจะทำงานต่อเนื่องไม่มีวันหยุดจนกว่าจะสั่งหยุดcompgen -G "$SOURCE_DIR/*": ตรวจสอบว่ามีไฟล์อยู่จริงหรือไม่ ป้องกันไม่ให้คำสั่งmvฟ้อง errorNo such file or directoryในรอบที่ไม่มีไฟล์2>/dev/null: ซ่อนข้อความแจ้งเตือนหรือ error ที่ไม่จำเป็น (กรณีรันคำสั่งแบบบรรทัดเดียว)sleep 5: หน่วงเวลา 5 วินาทีต่อรอบ สำคัญมาก เพราะหากไม่มีคำสั่งนี้ CPU จะทำงาน 100% ตลอดเวลาจากการวนลูปถี่เกินไป
ข้อควรระวังและการใช้งานจริง
- การหยุดทำงาน: กด
Ctrl + Cบน Terminal เพื่อสั่งยกเลิกกระบวนการลูปได้ทันที - ไฟล์ที่ยังดาวน์โหลดไม่เสร็จ: เบราว์เซอร์ส่วนใหญ่จะสร้างไฟล์ชั่วคราว เช่น
.crdownload(Chrome) หรือ.part(Firefox) หากต้องการกรองไม่ให้ย้ายไฟล์เหล่านี้ สามารถระบุเฉพาะนามสกุลไฟล์ปลายทางได้ เช่น:Bashmv ~/Downloads/*.pdf ~/Archive/ 2>/dev/null - การรันเบื้องหลัง (Background Process): หากต้องการปิดหน้าต่าง Terminal โดยให้คำสั่งยังทำงานอยู่ ให้ใช้
nohup ./move_files.sh > move.log 2>&1 &