จัดการไฟล์: mkdir, touch, cp, mv, rm + glob
5 คำสั่งจัดการไฟล์ + glob pattern (* ? [abc]) + warning เรื่อง rm -rf ที่เป็นคำสั่งอันตรายที่สุดใน terminal
3 บทแรกใช้เวลาไปกับการ “เดินและอ่าน” ตอนนี้ถึงเวลาลงมือ จัดการไฟล์จริง บทนี้จะให้เครื่องมือ 5 ตัวที่ครอบคลุมงานไฟล์ 95% ในชีวิตจริง mkdir, touch, cp, mv, rm
พร้อมกับ glob pattern สำหรับทำงานกับไฟล์หลายตัวพร้อมกันด้วยเครื่องหมาย * และ warning เรื่อง rm -rf ซึ่งเป็นคำสั่งที่อันตรายที่สุดใน terminal
5 คำสั่งจัดการไฟล์ที่ต้องจำ
mkdir ใช้สร้าง folder ใหม่
ย่อมาจาก make directory พิมพ์ mkdir ชื่อ ก็จะได้ folder ใหม่อยู่ใน cwd
$ mkdir my-project
$ ls
my-project/Flag ที่มีประโยชน์ที่สุดคือ -p (parents) สร้าง folder ซ้อนกันหลายชั้นได้ในครั้งเดียว ถ้า folder กลางยังไม่มี mkdir ปกติจะ error แต่ -p จะสร้างให้ครบ
$ mkdir -p src/components/ui
# ได้ครบทั้ง src/, src/components/, src/components/ui/touch ใช้สร้างไฟล์เปล่า
touch ชื่อไฟล์ ใช้สร้างไฟล์ใหม่ขนาด 0 byte ถ้าไฟล์มีอยู่แล้ว touch จะแค่ อัปเดต timestamp ไม่แก้เนื้อหา ใช้บ่อยตอนทำ placeholder สำหรับไฟล์ที่ยังไม่พร้อมเขียนเนื้อ
$ touch README.md
$ touch src/index.ts src/utils.ts
# สร้างพร้อมกัน 2 ไฟล์cp ใช้ copy ไฟล์
cp ต้นทาง ปลายทาง copy ไฟล์จากที่หนึ่งไปอีกที่
$ cp .env.example .env
$ cp config.json backup/config.jsonถ้าจะ copy folder ต้องใส่ -r (recursive) ไม่งั้น cp จะ error ว่า “omitting directory”
$ cp -r src/ src-backup/
# copy ทั้ง folder + ทุกอย่างข้างในmv ใช้ย้ายหรือ rename
คำสั่งเดียวทำสองหน้าที่ ย้ายก็ได้ เปลี่ยนชื่อก็ได้ ในมุมของ filesystem 2 อย่างนี้คืออันเดียวกัน
$ mv old-name.txt new-name.txt # rename ในที่เดิม
$ mv file.txt Documents/ # ย้ายไป folder อื่น
$ mv old/ new/ # rename folder (ไม่ต้องใช้ -r)rm ใช้ลบไฟล์ (อ่านก่อนรันทุกครั้ง)
rm ชื่อไฟล์ ลบไฟล์ หายทันที ไม่มี Trash ไม่มีถามยืนยัน ที่สำคัญคือ ในโลก terminal ของ Unix ไม่มีถังขยะ ลบคือหาย กู้คืนได้ยากมาก (ต้องใช้ tool พิเศษและบางครั้งกู้ไม่ได้เลย)
$ rm notes.txt # ไฟล์หายถาวร
$ rm -r old-folder/ # -r ลบ folder (recursive)
$ rm -i secrets.txt # -i ถามก่อนลบแต่ละไฟล์ (ปลอดภัยขึ้น)
$ rm -f nothing.txt # -f ไม่ error ถ้าไม่เจอ (ใช้ใน script)Glob pattern: ทำงานกับหลายไฟล์พร้อมกัน
ไม่อยากพิมพ์ rm ทีละ 20 ไฟล์ shell มี glob pattern ให้ระบุไฟล์เป็นกลุ่มได้ ด้วยเครื่องหมายพิเศษไม่กี่ตัว shell จะ expand pattern เป็นรายชื่อไฟล์จริงก่อนรันคำสั่ง
*ตัวอักษรใดก็ได้ 0 ตัวขึ้นไป (ยกเว้น/)?ตัวอักษร 1 ตัวใดก็ได้[abc]ตัวใดตัวหนึ่งใน list[a-z]ตัวใดตัวหนึ่งในช่วง
ลอง widget ข้างล่างดู พิมพ์ pattern เองหรือเลือก preset ไฟล์ที่ match จะสว่างขึ้น ส่วนไฟล์ที่ไม่ match จะจางลง สังเกตว่า * ไม่ match ไฟล์ที่ขึ้นต้นด้วย . ต้องพิมพ์ .* ระบุเอง
*= ตัวอักษรใดก็ได้ 0 ตัวขึ้นไป (ไม่รวม/)?= ตัวอักษร 1 ตัวใดก็ได้[abc]/[a-z]= ตัวใดตัวหนึ่งใน class*ไม่ match ไฟล์ hidden (ขึ้นต้น.) ต้องพิมพ์.*ระบุเอง
ตัวอย่างใช้งานจริง
$ rm *.bak # ลบทุกไฟล์ .bak ใน cwd
$ cp src/*.ts backup/ # copy .ts ทุกตัวใน src/ ไป backup/
$ ls [A-Z]* # list เฉพาะไฟล์ที่ขึ้นต้นพิมพ์ใหญ่
$ mv *.log logs/ # ย้าย .log ทั้งหมดไปรวมที่เดียวสรุป
- 5 commands:
mkdir,touch,cp,mv,rm - Flag ที่ใช้บ่อย:
-p(mkdir parents),-r(cp/rm recursive),-i(interactive ถามก่อนลบ) - Glob:
*= อะไรก็ได้,?= 1 ตัว,[abc]/[a-z]= char class *ไม่ match hidden files (ขึ้นต้น.) ต้อง.*ระบุเองrmลบไม่ไป Trash ลบคือหายrm -rfอ่านทุกครั้งก่อนรัน
ตอนนี้จัดการไฟล์ได้คล่องแล้ว บทต่อไปจะตอบคำถามที่ว่า “output ของคำสั่งไปไหน” ปกติมันโผล่ขึ้นหน้า terminal แต่ถ้าอยากเก็บเป็นไฟล์ หรือแยก error ออกจาก output ปกติต้องทำยังไง บทถัดไปจะรู้จัก 3 สายของคำสั่ง (stdin, stdout, stderr) ที่ทำให้ต่อคำสั่งเข้าด้วยกันได้