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ó
-p sẽ lỗimkdir 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
.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!)
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.
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
- Dùng
rm -iđể được hỏi xác nhận — chậm hơn nhưng an toàn. - Cài
brew install trashtrên macOS — gõtrash filesẽ chuyển vào Trash thay vì xóa hẳn. - Tạo alias trong
~/.zshrc:alias rm='rm -i'
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.
| Pattern | Khớp với | Ví 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/
rmrm * 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ự | File | Folder |
|---|---|---|
r (read) | Đọc nội dung | Liệt kê tên file bên trong |
w (write) | Sửa nội dung | Tạo/xóa/đổi tên file bên trong |
x (execute) | Chạy file (script/binary) | Vào folder (cd) |
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:
| Octal | Binary | Quyền |
|---|---|---|
7 | 111 | rwx |
6 | 110 | rw- |
5 | 101 | r-x |
4 | 100 | r-- |
0 | 000 | --- |
Các giá trị thường gặp:
| Octal | Ý nghĩa | Dùng cho |
|---|---|---|
755 | rwxr-xr-x | Folder, script chạy được — owner toàn quyền, người khác đọc + chạy |
644 | rw-r--r-- | File text bình thường — owner sửa được, người khác chỉ đọc |
700 | rwx------ | Folder/file chỉ owner truy cập (vd: ~/.ssh) |
600 | rw------- | 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]
- Đối tượng:
u= user,g= group,o= other,a= all - Toán tử:
+thêm,-bớt,=set chính xác - Quyền:
r,w,x
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: ********
sudo?/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:
- Tạo cấu trúc:
mkdir -p workspace/notes - Tạo file:
touch workspace/notes/idea.txt - Vào kiểm tra:
cd workspace && ls -la - Copy:
cp notes/idea.txt notes/idea-backup.txt - Đổi tên:
mv notes/idea.txt notes/great-idea.txt - Xóa file:
rm notes/idea-backup.txt - Xóa folder:
cd .. && rm -r workspace
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):
- Vào
~/Developer/IT Basic/CLI. Tạo folderpractice, vào trong. - Tạo cấu trúc:
practice/src/main.jsvàpractice/src/utils.jschỉ bằng 2 lệnh (gợi ý:mkdir -p+touchvới multiple args). - Trong
practice/, tạo 5 file:note1.txt,note2.txt, ...,note5.txtbằng 1 lệnh dùng brace expansion. - Copy toàn bộ folder
src/sangsrc-backup/. - Đổi tên
main.jsthànhapp.js. - Tạo file
hello.shchứa nội dungecho "Hi"(gợi ý:echo ... > hello.sh— sẽ học chi tiết ở Chương 3, giờ cứ thử). - Cấp quyền chạy cho
hello.sh:chmod +x hello.sh. Chạy nó:./hello.sh. - Kiểm tra
ls -l— quyền đã đổi thành gì? - Dọn dẹp: xóa toàn bộ
practice/. Dùngrm -rhayrm -rf? Vì sao?
9. Quiz — Kiểm tra kiến thức
10. Tổng kết
- ✅ Tạo file/folder:
mkdir -p,touch - ✅ Copy/move:
cp -r,mv(cũng dùng để rename) - ✅ Xóa cẩn thận:
rmkhông có Trash; cảnh giác với-rf - ✅ Wildcards:
*,?,[abc],{a,b} - ✅ Hiểu
rwxcho user/group/other; đọc đượcls -l - ✅ Dùng
chmod 755/chmod +xthành thạo - ✅ Biết khi nào cần
sudo, khi nào không
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ý.