Chương 02 — File operations & Permissions

Tạo, copy, di chuyển, xóa file an toàn. Hiểu mô hình quyền truy cập của Unix — công cụ phân biệt giữa "chỉ đọc được", "chạy được", và "sửa được".

1. Tạo file & folder

mkdir — make directory

$ mkdir notes              # tạo folder "notes"
$ mkdir a b c              # tạo nhiều folder cùng lúc
$ mkdir -p proj/src/utils  # -p: tạo cả parent nếu chưa có
⚠️ Không có -p sẽ lỗi
mkdir proj/src/utils chỉ chạy được nếu proj/src đã tồn tại. Cờ -p bảo: "tạo hết các parent còn thiếu, không báo lỗi nếu đã có".

touch — tạo file rỗng / cập nhật mtime

$ touch README.md         # tạo file rỗng
$ touch a.txt b.txt c.txt # nhiều file
$ touch README.md         # nếu đã có: chỉ update modified time

Trick hay: touch tạo file rỗng để placeholder, hoặc bump mtime để build system rebuild lại file đó.

2. Copy & di chuyển

cp — copy

$ cp a.txt b.txt           # copy file → file (b.txt là bản sao của a.txt)
$ cp a.txt notes/          # copy vào folder notes/
$ cp -r notes backup        # -r: copy đệ quy (cho folder)
$ cp -i a.txt b.txt        # -i: hỏi trước khi ghi đè (an toàn)
$ cp -v a.txt b.txt        # -v: verbose, in ra việc đang làm

mv — move HOẶC rename

Một mánh hay biết: trên Unix không có lệnh "rename" riêng. mv đảm nhiệm cả hai:

$ mv old.txt new.txt        # rename: cùng folder, khác tên
$ mv file.txt ~/Documents/  # move: khác folder
$ mv a.txt b.txt notes/     # nhiều file → 1 folder
💡 Trick rename hàng loạt
Để đổi đuôi nhiều file (vd .txt.md), kết hợp với for loop — bạn sẽ học chi tiết ở Chương 7.

3. Xóa — phải cẩn thận

rm — remove (KHÔNG có thùng rác!)

🛑 Quan trọng nhất chương này
rm không đưa file vào Trash. Một khi xóa là mất luôn, không có Cmd+Z. Hãy nhớ điều này trước khi gõ enter.
$ rm a.txt              # xóa 1 file
$ rm a.txt b.txt c.txt  # xóa nhiều file
$ rm -r notes            # -r: xóa folder và mọi thứ bên trong
$ rm -i a.txt           # -i: hỏi xác nhận từng file
$ rm -rf /tmp/build      # -f: force, không hỏi gì hết — RẤT NGUY HIỂM

rmdir — chỉ xóa folder RỖNG

$ rmdir empty-folder    # OK
$ rmdir notes           # Lỗi nếu notes/ có file bên trong

Tại sao tồn tại? Vì rmdir an toàn hơn rm -r — nó không thể xóa nhầm file quan trọng.

☠️ Lệnh KHÔNG BAO GIỜ được gõ
rm -rf /        # xóa toàn bộ máy
rm -rf /*       # tương đương
rm -rf ~        # xóa toàn bộ home directory
rm -rf "$VAR"   # nếu $VAR chưa set → thành rm -rf "" → vẫn nguy hiểm
Đừng cười — có cả engineer dày dạn từng vô tình chạy rm -rf / trên server production. Luôn nhìn lại lệnh trước khi enter, đặc biệt khi có -rf.

Cách an toàn hơn

4. Wildcards (glob pattern)

Khi muốn áp dụng lệnh cho nhiều file cùng lúc theo pattern, dùng wildcard. Shell sẽ expand chúng ra danh sách file thật trước khi gọi lệnh.

PatternKhớp vớiVí dụ
*Bất kỳ chuỗi nào (kể cả rỗng)*.txt → tất cả file .txt
?Đúng 1 ký tựfile?.txt → file1.txt, fileA.txt
[abc]Một trong các ký tự[abc].txt → a.txt, b.txt, c.txt
[a-z]Khoảng ký tựfile[0-9].txt → file0…file9
{a,b,c}Brace expansion{src,test}/main.js
$ ls *.txt                # mọi file .txt trong folder hiện tại
$ rm tmp_*                # xóa mọi file bắt đầu bằng tmp_
$ cp *.{js,ts} backup/    # copy mọi .js và .ts
$ mv img-?.png images/    # img-1.png, img-2.png... vào images/
⚠️ Cẩn thận khi kết hợp với rm
rm * không xóa file ẩn nhưng xóa hết file thường. Trước khi rm pattern, gõ ls pattern trước để xem pattern khớp đúng những file gì.

5. Quyền truy cập (Permissions) — phần cốt lõi

Chạy ls -l bạn sẽ thấy đầu mỗi dòng có 10 ký tự kỳ lạ:

-rw-r--r--  1 you  staff   42 May  8  README.md
drwxr-xr-x  3 you  staff  128 May  8  notes

Đọc 10 ký tự

 d  rwx  r-x  r-x
 │   │    │    └── other (mọi user khác)
 │   │    └─────── group (nhóm của file)
 │   └──────────── user (chủ file)
 └──────────────── type: d=dir, -=file, l=symlink

3 quyền cơ bản

Ký tựFileFolder
r (read)Đọc nội dungLiệt kê tên file bên trong
w (write)Sửa nội dungTạo/xóa/đổi tên file bên trong
x (execute)Chạy file (script/binary)Vào folder (cd)
📘 Lưu ý quan trọng về folder
r trên folder = biết tên file bên trong. x = vào được bên trong. Có r mà không có x: ls thấy tên nhưng không cd được, không cat được.

Octal notation (cách phổ biến nhất)

Mỗi nhóm 3 ký tự được mã hóa thành 1 chữ số 0-7:

OctalBinaryQuyền
7111rwx
6110rw-
5101r-x
4100r--
0000---

Các giá trị thường gặp:

OctalÝ nghĩaDùng cho
755rwxr-xr-xFolder, script chạy được — owner toàn quyền, người khác đọc + chạy
644rw-r--r--File text bình thường — owner sửa được, người khác chỉ đọc
700rwx------Folder/file chỉ owner truy cập (vd: ~/.ssh)
600rw-------File nhạy cảm — chỉ owner đọc/ghi (vd: ~/.ssh/id_rsa)

chmod — change mode

$ chmod 755 script.sh          # octal
$ chmod +x script.sh           # symbolic: thêm execute cho mọi người
$ chmod u+x script.sh          # chỉ thêm execute cho user (owner)
$ chmod go-w file.txt          # bỏ write cho group và other
$ chmod -R 755 my-project       # đệ quy cho cả thư mục con

Symbolic notation: [ugoa][+-=][rwx]

6. Owner & sudo

$ chown alice file.txt         # đổi owner thành alice
$ chown alice:devs file.txt    # owner=alice, group=devs
$ chgrp devs file.txt          # chỉ đổi group

Đổi owner thường yêu cầu sudo (chạy với quyền root):

$ sudo chown root /etc/myconfig
Password: ********
⚠️ Khi nào cần sudo?
Khi đụng vào file không thuộc về bạn: thường là file trong /etc, /usr, /var, hoặc cài đặt package toàn hệ thống. File trong ~/ của bạn không cần sudo. Nếu bạn thấy mình đang gõ sudo ở home directory, có lẽ đã sai chỗ nào.

7. Thử ngay trong terminal giả lập

Simulator đã hỗ trợ các lệnh mới — thử các kịch bản:

  1. Tạo cấu trúc: mkdir -p workspace/notes
  2. Tạo file: touch workspace/notes/idea.txt
  3. Vào kiểm tra: cd workspace && ls -la
  4. Copy: cp notes/idea.txt notes/idea-backup.txt
  5. Đổi tên: mv notes/idea.txt notes/great-idea.txt
  6. Xóa file: rm notes/idea-backup.txt
  7. Xóa folder: cd .. && rm -r workspace
you@mac — chuong2 practice
you@mac ~ $

8. Bài tập về nhà

Trên Terminal thật, làm tuần tự (xong báo lại tôi check):

  1. Vào ~/Developer/IT Basic/CLI. Tạo folder practice, vào trong.
  2. Tạo cấu trúc: practice/src/main.jspractice/src/utils.js chỉ bằng 2 lệnh (gợi ý: mkdir -p + touch với multiple args).
  3. Trong practice/, tạo 5 file: note1.txt, note2.txt, ..., note5.txt bằng 1 lệnh dùng brace expansion.
  4. Copy toàn bộ folder src/ sang src-backup/.
  5. Đổi tên main.js thành app.js.
  6. Tạo file hello.sh chứa nội dung echo "Hi" (gợi ý: echo ... > hello.sh — sẽ học chi tiết ở Chương 3, giờ cứ thử).
  7. Cấp quyền chạy cho hello.sh: chmod +x hello.sh. Chạy nó: ./hello.sh.
  8. Kiểm tra ls -l — quyền đã đổi thành gì?
  9. Dọn dẹp: xóa toàn bộ practice/. Dùng rm -r hay rm -rf? Vì sao?

9. Quiz — Kiểm tra kiến thức

10. Tổng kết

Chương 3 chúng ta sẽ học pipes & redirects — chỗ CLI thật sự thể hiện sức mạnh: ghép nhiều lệnh thành chuỗi xử lý.

Trước ← Chương 01: Navigation Tiếp theo Chương 03: Pipes & Redirects →