Linux Command
Linux Command
touch
บทนี้สอนการใช้ `touch` ตั้งแต่สร้างไฟล์หลายไฟล์ในคำสั่งเดียว, สร้างไฟล์แบบ nested path เมื่อโฟลเดอร์แม่มีอยู่แล้ว, และเข้าใจพฤติกรรมเมื่อแตะไฟล์ที่มีอยู่แล้ว (touched existing) เทียบกับไฟล์ที่สร้างใหม่ (created new)
1. หัวข้อนี้คืออะไร
`touch` คือคำสั่งสำหรับสร้างไฟล์ว่าง หรือแตะไฟล์เดิมเพื่ออัปเดตเวลาแก้ไข (timestamp) สำหรับบทนี้ เราโฟกัสการใช้งานที่เจอบ่อยในงานจริง: สร้างหลายไฟล์พร้อมกัน และสร้างไฟล์ตาม path ย่อย (nested path) ให้เป็นระบบ
2. ทำไมหัวข้อนี้สำคัญ
- เตรียมโครงไฟล์เริ่มต้นของโปรเจกต์ได้เร็วมาก
- ลดงานพิมพ์ซ้ำเมื่อต้องสร้างไฟล์หลายไฟล์ในครั้งเดียว
- ทำงานร่วมกับ `mkdir` ได้ดีเพื่อจัดโครงแบบ nested
- ช่วยแยกขั้นตอนชัดเจน: สร้างโครงก่อน แล้วค่อยเติมเนื้อหา
3. แนวคิดหลักที่ต้องเข้าใจ
- `touch` ใช้กับไฟล์ ไม่ใช่โฟลเดอร์
- `touch a b c` สร้างหลายไฟล์ได้ในคำสั่งเดียว
- `touch dir/file.txt` ใช้สร้างไฟล์ nested ได้ ถ้า `dir` มีอยู่แล้ว
- ถ้าไฟล์มีอยู่แล้ว `touch` จะรายงานว่าแตะไฟล์เดิม (Touched) แทนการสร้างใหม่
- หลังรันคำสั่ง ควรตรวจผลด้วย `ls` หรือ `ls -R`
4. Multi-target และ Nested Path
การใช้ `touch` แบบ multi-target คือพิมพ์ชื่อไฟล์หลายตัวต่อท้ายคำสั่งเดียว ถ้าต้องการสร้างไฟล์ในโฟลเดอร์ย่อย ให้ระบุ path ของไฟล์ เช่น `notes/todo.txt` หรือ `logs/app.log` โดยโฟลเดอร์แม่ต้องมีอยู่ก่อน
ตัวอย่างนี้ไม่ใช้ shell expansion เพื่อให้เห็น path เต็มแบบตรงไปตรงมา
mkdir -p notes logs
touch notes/todo.txt notes/guide.txt logs/app.log logs/error.log
ls -R5. Brace Expansion (ใน shell จริง)
ใน shell จริง (เช่น bash/zsh) เราสามารถย่อคำสั่งด้วย brace expansion ได้ เช่น `{a,b,c}` แนวคิดสำคัญ: shell จะขยายรายการให้เป็นหลาย path ก่อนส่งคำสั่ง `touch` ทำงาน
คำสั่งนี้เทียบเท่ากับการพิมพ์ path เต็มทีละไฟล์หลายตัว
mkdir -p notes logs
touch notes/{todo.txt,guide.txt,cli-cheatsheet.md,alias.txt} logs/{app.log,error.log,access.log,audit.log}
ls -Rสำหรับ Lab ในบทนี้ เราจะตรวจผลด้วยรูปแบบ path ที่ขยายแล้ว (explicit paths) เพื่อให้ผ่านได้เสถียรใน simulator
6. Touched Existing vs Created New
ถ้า target เป็นไฟล์ที่มีอยู่แล้ว `touch` จะไม่สร้างไฟล์ใหม่ แต่แตะไฟล์เดิม ถ้า target ยังไม่มี จะสร้างไฟล์ใหม่ทันที
ช่วยให้เห็นว่าคำสั่งเดียวสามารถมีทั้งไฟล์ที่ถูกแตะและไฟล์ที่ถูกสร้างใหม่
touch notes/todo.txt
touch notes/todo.txt notes/guide.txt
# ผลลัพธ์ที่เจอบ่อย:
# Touched "/home/student/workspace/notes/todo.txt".
# Created file "/home/student/workspace/notes/guide.txt".7. จุดที่ผู้เริ่มต้นมักสับสน
- คิดว่า `touch` สร้างโฟลเดอร์ได้ (จริง ๆ ต้องใช้ `mkdir`)
- สร้าง nested file ทั้งที่โฟลเดอร์แม่ยังไม่มี
- พิมพ์ชื่อไฟล์ผิดนามสกุลแล้วไม่ตรวจด้วย `ls`
- สับสนว่า brace expansion เป็นงานของ `touch` โดยตรง ทั้งที่จริงเป็นการขยายจาก shell
8. เปรียบเทียบกับคำสั่งใกล้เคียง
| คำสั่ง | หน้าที่ | ต่างจาก `touch` อย่างไร |
|---|---|---|
| `touch` | สร้างไฟล์ว่าง/แตะไฟล์เดิม | คำสั่งหลักของบทนี้ |
| `mkdir` | สร้างโฟลเดอร์ | สร้าง directory ไม่ได้สร้างไฟล์ |
| `ls` | แสดงรายการไฟล์และโฟลเดอร์ | ใช้ตรวจผล แต่ไม่สร้างไฟล์ |
9. Lab 1: สร้างหลายไฟล์ในคำสั่งเดียว
เป้าหมาย: สร้าง `index.html`, `style.css`, `script.js` ที่ `/home/student/workspace` ด้วยคำสั่งเดียว
Lab 1: touch แบบ multi-target
รัน `touch index.html style.css script.js` แล้วตรวจด้วย `ls`
10. Lab 2: สร้าง nested files แบบ explicit paths
เป้าหมาย: สร้างไฟล์ใน `notes/` และ `logs/` ด้วย explicit paths (ไม่บังคับ brace expansion ใน check)
Lab 2: nested touch paths
สร้างไฟล์ให้ครบในโฟลเดอร์ notes และ logs โดยพิมพ์ path เต็มแต่ละไฟล์
11. Lab 3: แตะไฟล์เดิมผสมสร้างไฟล์ใหม่
เป้าหมาย: ใช้ `touch` กับไฟล์เดิมและไฟล์ใหม่ในคำสั่งเดียว เพื่อเห็นพฤติกรรม mixed result
Lab 3: touched existing + created new
ให้แตะไฟล์เดิม `notes/todo.txt` และสร้างไฟล์ใหม่ `notes/guide.txt`, `logs/app.log`
12. สรุปท้ายบทแบบจำง่าย
- `touch` สร้างหลายไฟล์ได้ในคำสั่งเดียว
- `touch` สร้าง nested file ได้เมื่อ parent directory มีอยู่แล้ว
- brace expansion (`{...}`) เป็นความสามารถของ shell ที่ช่วยย่อคำสั่ง
- ไฟล์เดิม = Touched, ไฟล์ใหม่ = Created file
- หลังรันคำสั่ง ให้ตรวจผลด้วย `ls` หรือ `ls -R`