❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Làm việc với VPS thì ngày nào bạn cũng phải xử lý file: xem log, copy config, dọn dẹp thư mục cũ, tìm file bị thất lạc… Tất cả đều thông qua dòng lệnh. Bài này mình sẽ đi qua toàn bộ các lệnh cơ bản để quản lý file và thư mục trên Linux, từ liệt kê, tạo, copy, di chuyển cho đến xóa và tìm kiếm.

Lệnh quản lý file Linux

Các lệnh trong bài này hoạt động giống nhau trên cả Ubuntu lẫn AlmaLinux (và hầu hết mọi bản phân phối Linux khác). Nếu có điểm khác biệt, mình sẽ ghi chú riêng.

ls, Liệt kê file và thư mục

Lệnh đầu tiên bạn cần biết. ls giúp bạn xem có gì trong thư mục hiện tại (hoặc bất kỳ thư mục nào bạn chỉ định).

Dùng cơ bản

ls không kèm gì sẽ liệt kê nội dung thư mục hiện tại:

ls

Output sẽ ra danh sách tên file và thư mục, nhưng không có thêm thông tin gì khác. Muốn biết chi tiết hơn, bạn cần thêm option.

ls -la, Xem chi tiết, bao gồm file ẩn

ls -la

Đây là lệnh mình dùng nhiều nhất. Nó kết hợp hai option:

  • -l (long format): hiển thị dạng bảng chi tiết với permissions, owner, size, ngày chỉnh sửa.
  • -a (all): hiển thị cả file ẩn (file có tên bắt đầu bằng dấu chấm như .bashrc, .ssh).

Output sẽ trông kiểu như thế này:

drwxr-xr-x  5 root root 4096 Mar 10 14:22 .
drwxr-xr-x 19 root root 4096 Mar  5 09:15 ..
-rw-r--r--  1 root root 3106 Mar 10 14:22 .bashrc
drwx------  2 root root 4096 Mar  8 11:30 .ssh
-rw-r--r--  1 root root  807 Mar  5 09:15 .profile
drwxr-xr-x  2 root root 4096 Mar 10 10:00 scripts
-rw-r--r--  1 root root 1245 Mar  9 16:45 notes.txt

Đọc output của ls -l

Mỗi dòng output gồm nhiều cột, mình giải thích từ trái sang phải:

-rw-r--r--  1  root  root  1245  Mar 9 16:45  notes.txt
│            │  │     │     │     │             │
│            │  │     │     │     │             └── Tên file/thư mục
│            │  │     │     │     └── Ngày chỉnh sửa cuối
│            │  │     │     └── Kích thước (bytes)
│            │  │     └── Group sở hữu
│            │  └── User sở hữu
│            └── Số hard links
└── Permissions (quyền truy cập)

Phần permissions gồm 10 ký tự. Ký tự đầu tiên cho biết loại:

  • d = thư mục (directory)
  • - = file thường
  • l = symbolic link

9 ký tự còn lại chia thành 3 nhóm, mỗi nhóm 3 ký tự (rwx): quyền của owner, group, và others. Trong đó r = read, w = write, x = execute, - = không có quyền đó.

Ví dụ -rw-r--r-- nghĩa là: file thường, owner được đọc + ghi, group chỉ đọc, others chỉ đọc.

ls -lh, Hiển thị size dễ đọc

ls -lh

Option -h (human-readable) chuyển kích thước file từ bytes sang đơn vị dễ đọc hơn: K (kilobyte), M (megabyte), G (gigabyte). Thay vì thấy 1048576 thì bạn sẽ thấy 1.0M.

ls -lart, Sắp xếp theo thời gian

ls -lart

Lệnh này rất hữu ích khi bạn muốn xem file nào được chỉnh sửa gần nhất:

  • -t: sắp xếp theo thời gian chỉnh sửa (mới nhất trước).
  • -r: đảo ngược thứ tự (mới nhất xuống cuối).

Kết hợp -r với -t thì file mới nhất sẽ nằm ở dòng cuối cùng, dễ nhìn hơn khi thư mục có nhiều file.

cd, Di chuyển giữa các thư mục

cd (change directory) dùng để chuyển vị trí làm việc sang thư mục khác. Bạn sẽ dùng nó liên tục.

Cách dùng cơ bản

# Di chuyển đến thư mục /etc/nginx
cd /etc/nginx

# Lùi lại 1 cấp (thư mục cha) cd ..

# Về thư mục home của user hiện tại cd ~

# Quay lại thư mục bạn vừa ở trước đó cd -

Lệnh cd - rất tiện khi bạn đang nhảy qua nhảy lại giữa 2 thư mục. Mỗi lần gõ cd -, nó sẽ đưa bạn về thư mục trước đó và in ra đường dẫn.

Absolute path vs Relative path

Có hai cách chỉ đường dẫn trên Linux:

Absolute path (đường dẫn tuyệt đối): bắt đầu từ gốc /, luôn dẫn đến cùng một vị trí bất kể bạn đang ở đâu.

cd /var/log/nginx

Relative path (đường dẫn tương đối): tính từ thư mục hiện tại, không bắt đầu bằng /.

# Giả sử bạn đang ở /var/log
cd nginx
# Tương đương với cd /var/log/nginx

Trong đường dẫn tương đối, . là thư mục hiện tại, .. là thư mục cha. Ví dụ cd ../nginx nghĩa là lùi 1 cấp rồi vào thư mục nginx.

mkdir, Tạo thư mục

Tạo thư mục mới bằng mkdir (make directory).

# Tạo 1 thư mục
mkdir myproject
# Tạo nhiều thư mục cùng lúc
mkdir dir1 dir2 dir3

Nếu bạn muốn tạo cả cây thư mục nhiều cấp cùng lúc, dùng option -p (parents):

mkdir -p projects/webapp/src

Lệnh trên sẽ tạo cả 3 thư mục lồng nhau: projects, bên trong có webapp, bên trong nữa có src. Nếu không có -p mà thư mục cha chưa tồn tại, lệnh sẽ báo lỗi.

touch, Tạo file trống

touch tạo file trống (0 byte) hoặc cập nhật timestamp nếu file đã tồn tại.

# Tạo 1 file trống
touch myfile.txt
# Tạo nhiều file cùng lúc
touch file1.txt file2.txt file3.conf

Thực tế trên VPS, bạn hay dùng touch để tạo nhanh file config trống trước khi mở editor để viết nội dung. Hoặc trong script, dùng nó để tạo file đánh dấu (flag file) kiểu touch /tmp/backup-done.

cp, Sao chép file và thư mục

cp (copy) sao chép file hoặc thư mục từ nơi này sang nơi khác.

Sao chép file

# Copy file, đặt tên mới
cp config.conf config.conf.bak

# Copy file sang thư mục khác cp config.conf /tmp/

# Copy file sang thư mục khác, đổi tên luôn cp config.conf /tmp/config-backup.conf

Một thói quen tốt trước khi sửa file config: luôn backup bằng cp trước. Ví dụ trước khi sửa Nginx config:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

Sao chép thư mục

Muốn copy cả thư mục, bạn phải thêm -r (recursive):

cp -r myproject myproject-backup

Nếu không có -r, lệnh sẽ báo lỗi omitting directory và không copy gì cả.

cp -a, Giữ nguyên permissions

cp -a /var/www/html /backup/html-backup

Option -a (archive) giữ nguyên toàn bộ: permissions, ownership, timestamps, symbolic links. Tương đương với -dR --preserve=all. Dùng khi bạn muốn bản copy giống hệt bản gốc, đặc biệt khi backup website hay dữ liệu quan trọng.

mv, Di chuyển và đổi tên

mv (move) vừa dùng để di chuyển, vừa dùng để đổi tên. Thực chất hai thao tác này trên Linux là một.

Đổi tên

# Đổi tên file
mv old-name.txt new-name.txt
# Đổi tên thư mục
mv old-folder new-folder

Di chuyển

# Di chuyển file sang thư mục khác
mv report.txt /home/user/documents/

# Di chuyển nhiều file cùng lúc mv file1.txt file2.txt file3.txt /tmp/

# Di chuyển thư mục mv myproject /opt/

Khác với cp, lệnh mv không cần option -r khi làm việc với thư mục. Nó di chuyển nguyên cả thư mục và nội dung bên trong.

Lưu ý: nếu đích đã có file trùng tên, mv sẽ ghi đè mà không hỏi. Muốn được hỏi trước khi ghi đè, dùng mv -i (interactive).

rm, Xóa file và thư mục

rm (remove) xóa file hoặc thư mục. Đây là lệnh cần cẩn thận nhất.

Xóa file

# Xóa 1 file
rm file.txt
# Xóa nhiều file
rm file1.txt file2.txt file3.txt

Xóa thư mục

# Xóa thư mục và toàn bộ nội dung bên trong
rm -r mydir
# Xóa mà không hỏi xác nhận (force)
rm -rf mydir

Option -r (recursive) bắt buộc khi xóa thư mục. Option -f (force) bỏ qua mọi xác nhận và không báo lỗi nếu file không tồn tại.

⚠️ Cảnh báo quan trọng: Linux không có thùng rác. Khi bạn rm một file, nó biến mất vĩnh viễn. Không có Ctrl+Z, không có Recycle Bin. Đặc biệt cẩn thận với rm -rf khi đang là root, vì bạn có quyền xóa mọi thứ trên hệ thống. Luôn kiểm tra lại đường dẫn trước khi nhấn Enter.

Một số sai lầm kinh điển cần tránh:

# ❌ TUYỆT ĐỐI KHÔNG chạy lệnh này — xóa toàn bộ hệ thống
rm -rf /

# ❌ Cũng nguy hiểm — xóa hết thư mục hiện tại rm -rf *

# ✅ Luôn kiểm tra trước bằng ls ls mydir # Xác nhận đúng rồi mới xóa rm -r mydir

Đọc nội dung file: cat, head, tail, less

Trên VPS bạn không có GUI để mở file, nên cần dùng các lệnh sau để xem nội dung.

cat, Xem toàn bộ file

cat /etc/hostname

cat in toàn bộ nội dung file ra terminal. Phù hợp với file ngắn (vài chục dòng). Nếu file dài hàng nghìn dòng, nội dung sẽ chạy ào ào và bạn chỉ thấy phần cuối.

Một vài cách dùng hữu ích:

# Hiển thị kèm số dòng
cat -n /etc/nginx/nginx.conf
# Nối nhiều file lại với nhau
cat part1.txt part2.txt > combined.txt

head, Xem phần đầu file

# Mặc định hiển thị 10 dòng đầu
head /etc/passwd

# Hiển thị 20 dòng đầu head -20 /etc/passwd

# Hoặc viết đầy đủ head -n 20 /etc/passwd

Hữu ích khi bạn muốn “nhìn lướt” xem file chứa gì mà không cần đọc hết.

tail, Xem phần cuối file

# 10 dòng cuối
tail /var/log/syslog
# 20 dòng cuối
tail -20 /var/log/syslog

Nhưng tính năng hay nhất của tail là option -f (follow):

tail -f /var/log/syslog

Lệnh này sẽ không thoát ra mà tiếp tục “theo dõi” file. Mỗi khi có dòng mới được ghi vào, nó sẽ hiển thị ngay trên terminal. Cực kỳ hữu ích khi bạn muốn theo dõi log real-time, ví dụ đang debug lỗi Nginx hay theo dõi access log.

Nhấn Ctrl + C để thoát khỏi tail -f.

Trên Ubuntu, file log hệ thống thường là /var/log/syslog. Trên AlmaLinux (và các distro RHEL-based), file tương ứng là /var/log/messages. Ngoài ra, trên AlmaLinux bạn cũng có thể dùng journalctl -f để xem log real-time.

less, Đọc file từng trang

less /var/log/syslog

less mở file trong chế độ xem từng trang, bạn có thể cuộn lên xuống thoải mái. Đây là lựa chọn tốt nhất khi đọc file dài.

Các phím thao tác trong less:

  • Space hoặc Page Down: cuộn xuống 1 trang.
  • b hoặc Page Up: cuộn lên 1 trang.
  • / : cuộn từng dòng.
  • /keyword: tìm kiếm từ trong file (nhấn n để đến kết quả tiếp theo).
  • g: về đầu file.
  • G: đến cuối file.
  • q: thoát.

wc, Đếm dòng, từ, ký tự

wc (word count) đếm số dòng, số từ và số ký tự trong file.

wc /etc/passwd

Output sẽ có dạng:

  35   55  1825  /etc/passwd
# dòng  từ  ký tự  tên file

Nếu chỉ muốn biết một thông tin cụ thể:

# Chỉ đếm số dòng
wc -l /etc/passwd

# Chỉ đếm số từ wc -w /etc/passwd

# Chỉ đếm số ký tự (bytes) wc -c /etc/passwd

Ứng dụng thực tế: kiểm tra có bao nhiêu user trên hệ thống bằng wc -l /etc/passwd, hoặc đếm số dòng log được ghi trong ngày.

find, Tìm file và thư mục

find là công cụ tìm kiếm file mạnh nhất trên Linux. Bạn có thể tìm theo tên, kích thước, thời gian chỉnh sửa, permissions, và nhiều tiêu chí khác.

Tìm theo tên

# Tìm file có tên chính xác, bắt đầu từ /
find / -name "nginx.conf"

# Tìm không phân biệt hoa thường find / -iname "readme.md"

# Tìm trong thư mục cụ thể find /etc -name "*.conf"

Lệnh find / -name "nginx.conf" sẽ tìm từ thư mục gốc, duyệt qua toàn bộ hệ thống. Nếu bạn biết file nằm quanh đâu, hãy thu hẹp phạm vi tìm kiếm (ví dụ /etc) để lệnh chạy nhanh hơn.

Tìm theo kích thước

# Tìm file lớn hơn 100MB trong /var/log
find /var/log -size +100M

# Tìm file lớn hơn 1GB trên toàn hệ thống find / -size +1G

# Tìm file nhỏ hơn 10KB find /tmp -size -10k

Rất hữu ích khi ổ đĩa sắp đầy và bạn cần tìm xem file nào đang chiếm nhiều dung lượng.

Tìm theo thời gian

# File được chỉnh sửa trong 7 ngày gần nhất
find /var/log -mtime -7
# File được chỉnh sửa hơn 30 ngày trước
find /tmp -mtime +30

Tìm theo loại

# Chỉ tìm thư mục
find /var -type d -name "log"
# Chỉ tìm file (không bao gồm thư mục)
find /etc -type f -name "*.conf"

Nếu chạy find từ thư mục gốc /, bạn sẽ thấy nhiều dòng báo “Permission denied” vì có những thư mục chỉ root mới vào được. Thêm 2>/dev/null vào cuối lệnh để ẩn các dòng lỗi: find / -name "nginx.conf" 2>/dev/null

ln, Symbolic links

Symbolic link (symlink) giống như shortcut trên Windows. Nó là một file đặc biệt trỏ đến file hoặc thư mục khác.

# Tạo symlink
ln -s /path/to/target linkname
# Ví dụ thực tế: tạo shortcut đến config Nginx
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf

Khi bạn ls -l, symlink sẽ hiển thị với mũi tên chỉ đến file gốc:

lrwxrwxrwx 1 root root 39 Mar 10 14:00 mysite.conf -> /etc/nginx/sites-available/mysite.conf

Vài điều cần biết về symlink:

  • Nếu file gốc bị xóa, symlink vẫn còn nhưng trỏ đến “hư không” (gọi là broken link).
  • Xóa symlink không ảnh hưởng đến file gốc.
  • Option -s là bắt buộc để tạo symbolic link. Nếu không có -s, ln sẽ tạo hard link (khác hoàn toàn, ít khi dùng).

Wildcard, Ký tự đại diện

Wildcard cho phép bạn chỉ định nhiều file cùng lúc dựa trên pattern, thay vì phải gõ từng tên file.

Dấu *, Khớp mọi thứ

# Liệt kê tất cả file .conf trong /etc/nginx
ls /etc/nginx/*.conf

# Xóa tất cả file .log rm /tmp/*.log

# Copy tất cả file .txt sang thư mục khác cp *.txt /backup/

* khớp với mọi chuỗi ký tự (kể cả chuỗi rỗng). Ví dụ *.conf sẽ khớp nginx.conf, my-app.conf, test.conf,…

Dấu ?, Khớp đúng 1 ký tự

# Khớp file1.txt, file2.txt, file3.txt... (nhưng không khớp file10.txt)
ls file?.txt

Ngoặc vuông [ ], Khớp 1 trong các ký tự

# Khớp filea.txt, fileb.txt, filec.txt
ls file[abc].txt

# Khớp file có ký tự từ a-z ls file[a-z].txt

# Khớp file có ký tự số ls log[0-9].txt

Wildcard hoạt động với hầu hết mọi lệnh, không riêng gì ls. Bạn có thể dùng với cp, mv, rm, cat, và nhiều lệnh khác.

Tips giúp thao tác nhanh hơn

Tab completion, Tự động hoàn thành

Đây là tính năng bạn nên dùng liên tục. Khi gõ một phần tên file hoặc thư mục, nhấn phím Tab để shell tự động hoàn thành phần còn lại.

# Gõ:
cd /etc/ngi
# Nhấn Tab, shell tự hoàn thành thành:
cd /etc/nginx/

Nếu có nhiều kết quả khớp, nhấn Tab hai lần để xem danh sách tất cả các lựa chọn.

Tab completion hoạt động với đường dẫn và cả với tên lệnh. Gõ sys rồi nhấn Tab hai lần sẽ liệt kê tất cả lệnh bắt đầu bằng sys.

Arrow up, Lịch sử lệnh

Nhấn phím mũi tên lên để gọi lại các lệnh đã gõ trước đó. Cực kỳ tiện khi bạn cần chạy lại hoặc chỉnh sửa lệnh vừa dùng.

Một số phím tắt liên quan:

  • / : duyệt qua lịch sử lệnh.
  • Ctrl + R: tìm kiếm trong lịch sử lệnh. Gõ một phần lệnh, nó sẽ tìm lệnh gần nhất khớp.
  • history: xem toàn bộ lịch sử lệnh đã gõ.

Một số phím tắt hữu ích khác

  • Ctrl + C: hủy lệnh đang chạy.
  • Ctrl + L: xóa màn hình terminal (giống lệnh clear).
  • Ctrl + A: di chuyển con trỏ về đầu dòng.
  • Ctrl + E: di chuyển con trỏ về cuối dòng.

Checkpoint: Thực hành tổng hợp

Bây giờ bạn thử kết hợp tất cả những gì đã học bằng bài thực hành sau. Mục tiêu: tạo cây thư mục, tạo file, copy, xem nội dung, rồi dọn dẹp.

# 1. Tạo cây thư mục 3 cấp
mkdir -p ~/lab/project/src
mkdir -p ~/lab/project/docs
mkdir -p ~/lab/backup

# 2. Xem cấu trúc đã tạo ls -R ~/lab

# 3. Tạo vài file echo "Hello Linux" > ~/lab/project/src/app.py echo "# My Project" > ~/lab/project/docs/README.md touch ~/lab/project/src/config.ini

# 4. Liệt kê chi tiết ls -la ~/lab/project/src/

# 5. Xem nội dung file cat ~/lab/project/src/app.py cat ~/lab/project/docs/README.md

# 6. Copy file sang thư mục backup cp ~/lab/project/src/app.py ~/lab/backup/ cp -r ~/lab/project/docs ~/lab/backup/

# 7. Kiểm tra backup ls -la ~/lab/backup/

# 8. Đổi tên file mv ~/lab/backup/app.py ~/lab/backup/app.py.bak

# 9. Đếm dòng wc -l ~/lab/project/src/app.py

# 10. Tìm file .md trong thư mục lab find ~/lab -name "*.md"

# 11. Dọn dẹp khi xong rm -r ~/lab

Chạy từng lệnh một, quan sát output của mỗi lệnh để hiểu nó làm gì. Nếu bạn đã chạy hết mà không gặp lỗi nào thì xem như đã nắm vững phần quản lý file cơ bản trên Linux rồi.

Bài tiếp theo mình sẽ đi vào phần xử lý text nâng cao hơn với grep, sed, awk cùng với redirect và pipe, giúp bạn kết hợp các lệnh lại với nhau để làm những việc phức tạp hơn.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Trần Thắng

Trần Thắng

Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI