Thao Tác File và Thư Mục

K
Kai··4 min read

Bài 2 cho biết file nằm đâu. Bài này thao tác với chúng: tạo, sao chép, di chuyển, đổi tên, xóa, liên kết, và tìm file. Đây là nhóm lệnh bạn dùng nhiều nhất mỗi ngày.

Mở lab (docker start -ai linuxlab) và làm việc trong /tmp cho an toàn:

cd /tmp

Tạo file và thư mục

touch a.txt b.txt        # tạo file rỗng (hoặc cập nhật thời gian nếu đã có)
mkdir proj               # tạo thư mục
mkdir -p proj/src/utils  # -p tạo cả cây thư mục lồng nhau, không báo lỗi nếu đã tồn tại

touch tạo file rỗng; nếu file đã có, nó chỉ cập nhật mốc thời gian. mkdir -p rất hay dùng: tạo luôn các thư mục cha còn thiếu trong một lần.

Sao chép và di chuyển

cp a.txt proj/           # sao chép file vào thư mục proj
cp -r proj proj-backup   # -r (recursive) để sao chép cả thư mục
mv b.txt proj/src/       # di chuyển file
mv a.txt readme.txt      # đổi tên (mv chính là lệnh đổi tên trong Linux)

Lưu ý: mv vừa là di chuyển vừa là đổi tên — Linux không có lệnh "rename" riêng. Nếu đích là thư mục, nó di chuyển; nếu đích là tên mới cùng chỗ, nó đổi tên.

Xem cây thư mục để kiểm tra:

ls -R proj
proj:
a.txt  src

proj/src:
b.txt

(ls -R liệt kê đệ quy. Lệnh tree cho hình cây đẹp hơn nhưng cần cài: apt-get install -y tree.)

Xóa — và một cảnh báo

rm readme.txt            # xóa file
rm -r proj-backup        # -r xóa cả thư mục và nội dung
rmdir proj/src/utils     # chỉ xóa thư mục RỖNG

Cảnh báo quan trọng: Linux không có thùng rác cho dòng lệnh. rm xóa là mất, không khôi phục được. Đặc biệt nguy hiểm là rm -rf (force, recursive, không hỏi) — gõ nhầm đường dẫn có thể xóa sạch dữ liệu. Quy tắc: trước khi rm -r, chạy ls lên đúng đường dẫn đó để chắc mình đang xóa cái gì. Và không bao giờ chạy rm -rf / hay rm -rf /*.

Wildcard: thao tác hàng loạt

Shell mở rộng các ký tự đặc biệt (gọi là globbing) thành danh sách file khớp, trước khi chạy lệnh:

  • * — khớp bất kỳ chuỗi nào (kể cả rỗng)
  • ? — khớp đúng một ký tự
  • [...] — khớp một ký tự trong tập
touch log1.txt log2.txt log3.txt note.md
ls log*.txt        # log1.txt log2.txt log3.txt
ls *.md            # note.md
ls log?.txt        # log1.txt log2.txt log3.txt (mỗi ? một ký tự)
ls log[12].txt     # log1.txt log2.txt
rm log*.txt        # xóa tất cả file log...txt cùng lúc

Wildcard hoạt động với mọi lệnh, không riêng ls/rm. Đây là cách thao tác nhiều file một lần.

Liên kết: ln -s

Liên kết tượng trưng (symbolic link / symlink) là một "lối tắt" trỏ tới file/thư mục khác:

ln -s /tmp/proj/a.txt link-to-a
ls -l link-to-a
lrwxrwxrwx ... link-to-a -> /tmp/proj/a.txt

Ký tự l đầu dòng (Bài 2) cho biết đây là symlink. Symlink dùng nhiều để trỏ "phiên bản hiện tại" tới một thư mục cụ thể, hoặc đưa một lệnh vào PATH. (Có cả hard link tạo bằng ln không -s, nhưng symlink phổ biến hơn nhiều.)

Tìm file với find

find duyệt cây thư mục theo điều kiện:

find /tmp/proj -name "*.txt"        # tìm theo tên
find /tmp -type d -name "proj"      # -type d: chỉ thư mục (f: file)
find /tmp -name "*.log" -size +10M  # file .log lớn hơn 10MB
/tmp/proj/a.txt
/tmp/proj/src/b.txt

find rất mạnh, còn chạy được lệnh trên mỗi kết quả bằng -exec:

find /tmp -name "*.tmp" -exec rm {} \;   # tìm và xóa từng file .tmp

{} là chỗ thay bằng tên file tìm được; \; kết thúc lệnh. Đây là mẫu hay dùng để dọn dẹp hàng loạt theo điều kiện.

Phân biệt nhanh: find duyệt hệ thống file theo điều kiện (tên, loại, kích thước, thời gian); còn để tìm nội dung bên trong file thì dùng grep (Bài 5).

🧹 Dọn dẹp

cd /tmp && rm -rf proj proj-backup note.md link-to-a *.txt
ls /tmp

Tổng kết

Bạn đã nắm nhóm lệnh thao tác file cốt lõi: touch/mkdir -p (tạo), cp -r/mv (sao chép, di chuyển, đổi tên), rm -r/rmdir (xóa — nhớ không có thùng rác), ln -s (liên kết), wildcard * ? [] (hàng loạt), và find (tìm theo điều kiện, kèm -exec). Quy tắc an toàn quan trọng nhất: cẩn thận với rm -rf, luôn ls kiểm tra đường dẫn trước khi xóa.

Tạo và di chuyển file rồi, nhưng để sửa nội dung file ngay trên terminal thì cần một trình soạn thảo. Bài 4 học nano và vim — hai trình soạn thảo bạn chắc chắn gặp trên server.