PlusMagi's Blog By Pitt Phunsanit Linux,macOS,Shell Script,Unix-like สั่งวนลูป while true ใน Terminal

สั่งวนลูป while true ใน Terminal

การใช้ลูป 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 ฟ้อง error No such file or directory ในรอบที่ไม่มีไฟล์
  • 2>/dev/null: ซ่อนข้อความแจ้งเตือนหรือ error ที่ไม่จำเป็น (กรณีรันคำสั่งแบบบรรทัดเดียว)
  • sleep 5: หน่วงเวลา 5 วินาทีต่อรอบ สำคัญมาก เพราะหากไม่มีคำสั่งนี้ CPU จะทำงาน 100% ตลอดเวลาจากการวนลูปถี่เกินไป

ข้อควรระวังและการใช้งานจริง

  1. การหยุดทำงาน: กด Ctrl + C บน Terminal เพื่อสั่งยกเลิกกระบวนการลูปได้ทันที
  2. ไฟล์ที่ยังดาวน์โหลดไม่เสร็จ: เบราว์เซอร์ส่วนใหญ่จะสร้างไฟล์ชั่วคราว เช่น .crdownload (Chrome) หรือ .part (Firefox) หากต้องการกรองไม่ให้ย้ายไฟล์เหล่านี้ สามารถระบุเฉพาะนามสกุลไฟล์ปลายทางได้ เช่น:Bashmv ~/Downloads/*.pdf ~/Archive/ 2>/dev/null
  3. การรันเบื้องหลัง (Background Process): หากต้องการปิดหน้าต่าง Terminal โดยให้คำสั่งยังทำงานอยู่ ให้ใช้
    nohup ./move_files.sh > move.log 2>&1 &