Trong môi trường Linux, việc thành thạo các lệnh dòng lệnh là yếu tố then chốt để quản lý hệ thống hiệu quả. Bài viết này sẽ đi sâu vào các lệnh phổ biến và nâng cao hơn, giúp bạn thao tác với tệp và thư mục một cách linh hoạt, từ tìm kiếm đến quản lý quyền và tạo liên kết.
1. Tìm kiếm tệp và thư mục với lệnh find
Lệnh find là một công cụ mạnh mẽ để định vị các tệp và thư mục dựa trên nhiều tiêu chí khác nhau. Cú pháp cơ bản:
find [đường_dẫn_bắt_đầu] [tiêu_chí_lọc] [hành_động]
1.1. Các tùy chọn và tham số chính
-name: Lọc theo tên tệp. Hỗ trợ ký tự đại diện (wildcards) để tìm kiếm linh hoạt hơn:*: Khớp với bất kỳ chuỗi ký tự nào (bao gồm cả chuỗi rỗng).?: Khớp với một ký tự đơn lẻ bất kỳ.[...]: Khớp với bất kỳ ký tự nào trong dấu ngoặc vuông. Ví dụ:[a-z]khớp với chữ cái thường.[^...]: Khớp với bất kỳ ký tự nào KHÔNG nằm trong dấu ngoặc vuông.
Ví dụ tìm kiếm tệp bằng
-name:# Tìm tất cả các tệp .log trong thư mục hiện tại và các thư mục con find . -name "*.log" # Tìm các tệp .csv bắt đầu bằng "report" find . -name "report*.csv" # Tìm các tệp .json bắt đầu bằng "data" theo sau là một ký tự duy nhất find . -name "data?.json" # Tìm các tệp .ini bắt đầu bằng "config" HOẶC các tệp .cfg bắt đầu bằng "settings" find . -name "config*.ini" -o -name "settings*.cfg"-empty: Tìm các thư mục rỗng hoặc tệp có kích thước bằng không.-uid: Lọc tệp thuộc về một ID người dùng cụ thể. Có thể dùng+UID(lớn hơn ID) hoặc-UID(nhỏ hơn ID).-gid: Lọc tệp thuộc về một ID nhóm cụ thể. Tương tự như-uid.-type: Lọc theo loại tệp. Ví dụ:fcho tệp thông thường,dcho thư mục,lcho liên kết tượng trưng.-size: Lọc theo kích thước tệp. Ví dụ:+10M(lớn hơn 10MB),-5k(nhỏ hơn 5KB).-exec: Thực thi một lệnh trên mỗi tệp tìm thấy. Lệnh này phải kết thúc bằng\;và{}đại diện cho tên tệp tìm được.-delete: Xóa các tệp tìm thấy.-print: In đường dẫn đầy đủ của các tệp tìm thấy (là hành động mặc định).-maxdepth: Giới hạn độ sâu tìm kiếm trong các thư mục con.
1.2. Các ví dụ thực tế
- Tìm và in ra tất cả các tệp Python (
.py) trong thư mục hiện tại và các thư mục con:find . -name "*.py" - Tìm tất cả các tệp thông thường trong thư mục
/var/logvà liệt kê chúng:find /var/log -type f -print - Tìm các tệp trong thư mục
/tmpcó kích thước nhỏ hơn 500KB và xóa chúng:find /tmp -size -500k -delete - Tìm tệp
my_script.shtrong thư mục hiện tại và các thư mục con, sau đó cấp quyền thực thi cho nó:find . -name "my_script.sh" -exec chmod +x {} \;
1.3. Kết hợp điều kiện tìm kiếm: AND, OR, NOT
Lệnh find mặc định sử dụng toán tử logic AND (tất cả các điều kiện phải đúng). Bạn có thể dùng -o cho toán tử OR và ! cho toán tử NOT.
- Toán tử AND (mặc định):
# Tìm tệp có tên "config.conf" và là một tệp thông thường find /etc -name "config.conf" -type f - Toán tử OR (
-o):# Tìm tệp có tên "report.txt" HOẶC "summary.txt" trong thư mục /home/user find /home/user \( -name "report.txt" -o -name "summary.txt" \) -type f - Toán tử NOT (
!):# Tìm các tệp thông thường KHÔNG có tên "temp.file" trong thư mục /var/www find /var/www ! -name "temp.file" -type f
Để đảm bảo thứ tự ưu tiên của các toán tử, đặc biệt khi kết hợp nhiều điều kiện, bạn nên sử dụng dấu ngoặc đơn \( ... \) để nhóm các điều kiện lại.
Ví dụ: Tìm các tệp có tên "archive.zip" và là tệp thông thường trong thư mục /storage, HOẶC tìm các thư mục có tên "backup_data":
find /storage \( -name "archive.zip" -type f \) -o \( -name "backup_data" -type d \)
Nếu không có dấu ngoặc đơn, lệnh có thể được hiểu sai do ưu tiên của toán tử AND cao hơn OR, dẫn đến kết quả không mong muốn.
2. Điều chỉnh quyền truy cập tệp/thư mục với lệnh chmod
Lệnh chmod (change mode) được dùng để thay đổi quyền đọc (read), ghi (write), và thực thi (execute) cho chủ sở hữu, nhóm, và người dùng khác.
2.1. Cú pháp cơ bản
chmod [tùy_chọn] [chế_độ_quyền] [tệp/thư_mục]
2.2. Các tùy chọn thông dụng
-R: Thay đổi quyền một cách đệ quy cho cả thư mục và nội dung bên trong.-v: Hiển thị chi tiết các thay đổi quyền đã thực hiện.-c: Chỉ hiển thị thông tin khi có thay đổi quyền.
2.3. Các chế độ quyền
Có thể sử dụng dạng ký hiệu hoặc dạng số để thiết lập quyền.
Dạng ký hiệu
- Người dùng:
u(chủ sở hữu),g(nhóm),o(người khác),a(tất cả). - Thao tác:
+(thêm quyền),-(bỏ quyền),=(thiết lập quyền chính xác). - Quyền:
r(đọc),w(ghi),x(thực thi).
Ví dụ:
# Thêm quyền ghi cho nhóm vào tệp data.csv
chmod g+w data.csv
# Bỏ quyền đọc và thực thi của người khác trên script.sh
chmod o-rx script.sh
Dạng số (Octal)
Sử dụng ba chữ số, mỗi chữ số đại diện cho quyền của chủ sở hữu, nhóm và người khác, theo thứ tự. Giá trị của từng quyền:
4: Đọc (r)2: Ghi (w)1: Thực thi (x)
Cộng các giá trị này để tạo thành số octal cho mỗi loại người dùng.
Ví dụ:
7 (rwx): Đọc, ghi, thực thi.6 (rw-): Đọc, ghi.5 (r-x): Đọc, thực thi.4 (r--): Chỉ đọc.
Ví dụ thiết lập quyền:
# Chủ sở hữu có quyền đọc/ghi/thực thi (7), nhóm và người khác chỉ có quyền đọc/thực thi (5)
chmod 755 public_script.sh
# Chủ sở hữu có quyền đọc/ghi (6), nhóm chỉ có quyền đọc (4), người khác không có quyền (0)
chmod 640 config.ini
# Chỉ chủ sở hữu có toàn quyền (7), không ai khác có quyền (00)
chmod 700 private_key.pem
3. Tạo tệp rỗng hoặc cập nhật thời gian với lệnh touch
Lệnh touch được dùng để tạo một tệp mới nếu nó chưa tồn tại, hoặc để cập nhật thời gian truy cập và sửa đổi của một tệp.
3.1. Cú pháp cơ bản
touch [tùy_chọn] [tên_tệp]
3.2. Các tùy chọn chính
-a: Chỉ cập nhật thời gian truy cập (access time).-c: Không tạo tệp mới nếu tệp chưa tồn tại (chỉ cập nhật nếu tệp đã có).-m: Chỉ cập nhật thời gian sửa đổi (modification time).-d "YYYY-MM-DD HH:MM:SS": Sử dụng thời gian được chỉ định thay vì thời gian hiện tại.
3.3. Ví dụ
- Tạo một tệp văn bản mới có tên
new_document.md:touch new_document.md - Cập nhật thời gian truy cập và sửa đổi của tệp
existing_file.loglên thời điểm hiện tại:touch existing_file.log - Chỉ cập nhật thời gian truy cập cho
access_log.txt:touch -a access_log.txt - Chỉ cập nhật thời gian sửa đổi cho
report.pdf:touch -m report.pdf - Thiết lập thời gian cụ thể cho tệp
scheduled_task.sh:touch -d "2024-03-15 09:30:00" scheduled_task.sh
4. Xem tài liệu hướng dẫn với lệnh man
Lệnh man (manual) hiển thị trang hướng dẫn sử dụng (man page) cho hầu hết các lệnh và tiện ích trên Linux. Đây là nguồn tài liệu chính thức và chi tiết nhất để tìm hiểu về cách sử dụng một lệnh cụ thể.
man [tên_lệnh]
Ví dụ: Để xem hướng dẫn chi tiết về lệnh find, bạn chỉ cần gõ man find.
5. Hiển thị thông báo với lệnh echo
Lệnh echo được sử dụng để in các chuỗi ký tự hoặc giá trị của biến ra thiết bị đầu cuối (standard output).
5.1. Cú pháp cơ bản
echo [tùy_chọn] [chuỗi_hoặc_biến]
5.2. Các tùy chọn phổ biến
-e: Cho phép sử dụng các ký tự thoát (escape characters) như\n(xuống dòng),\t(tab).-n: Không thêm ký tự xuống dòng ở cuối chuỗi.
5.3. Ví dụ
- In một thông báo đơn giản:
echo "Xin chào, Linux!" - In giá trị của một biến:
city="Hà Nội" echo "Chào mừng đến với $city!" - Sử dụng ký tự thoát để định dạng đầu ra:
echo -e "Dòng thứ nhất.\nDòng thứ hai." - In mà không xuống dòng:
echo -n "Đây là một đoạn văn bản tiếp tục." echo " Và đây là phần cuối."Kết quả sẽ hiển thị trên cùng một dòng:
Đây là một đoạn văn bản tiếp tục. Và đây là phần cuối.
6. Hiển thị và nối tệp với lệnh cat
Lệnh cat (concatenate) được dùng để hiển thị nội dung của tệp, nối nhiều tệp lại với nhau, hoặc tạo tệp mới.
6.1. Cú pháp cơ bản
cat [tùy_chọn] [tệp]...
6.2. Các tùy chọn hữu ích
-n: Hiển thị số dòng cho tất cả các dòng.-b: Chỉ hiển thị số dòng cho các dòng không rỗng.-s: Nén các dòng trống liên tiếp thành một dòng trống duy nhất.-E: Hiển thị ký tự$ở cuối mỗi dòng.
6.3. Ví dụ
- Hiển thị toàn bộ nội dung của tệp
document.txt:cat document.txt - Hiển thị nội dung tệp
script.shkèm theo số dòng:cat -n script.sh - Nối ba tệp
header.txt,body.txt,footer.txtvà in ra màn hình:cat header.txt body.txt footer.txt - Tạo một tệp mới tên
my_new_file.txtvà nhập nội dung trực tiếp từ bàn phím (nhấn Ctrl+D để lưu và thoát):cat > my_new_file.txt - Thêm nội dung vào cuối tệp
existing_log.txttừ bàn phím:cat >> existing_log.txt
7. Xem số inode của tệp/thư mục với lệnh ls -il
Trong hệ thống tệp Linux, mỗi tệp và thư mục đều có một inode (index node) duy nhất. Inode là một cấu trúc dữ liệu lưu trữ siêu dữ liệu (metadata) của tệp, bao gồm quyền truy cập, kích thước, chủ sở hữu, thời gian tạo/sửa đổi, và vị trí các khối dữ liệu thực sự của tệp trên đĩa. Số inode là một mã định danh duy nhất cho cấu trúc inode này.
Lệnh ls -il hiển thị danh sách các tệp và thư mục cùng với số inode tương ứng của chúng, cho phép bạn hiểu rõ hơn cách hệ thống tệp quản lý thông tin.
ls -il [tên_tệp_hoặc_thư_mục]
Ví dụ: Để xem số inode của tệp document.txt, bạn gõ ls -il document.txt.
8. Tạo liên kết tượng trưng (Symbolic Link / Soft Link)
Liên kết tượng trưng, hay còn gọi là soft link hoặc symlink, là một loại tệp đặc biệt trỏ đến một tệp hoặc thư mục khác. Nó hoạt động tương tự như một shortcut trong Windows. Nếu tệp gốc bị xóa, liên kết tượng trưng sẽ trở thành "đứt gãy" (dangling link) và không thể truy cập được dữ liệu.
8.1. Cú pháp cơ bản
ln -s [đường_dẫn_tới_tệp_gốc] [tên_liên_kết]
8.2. Ví dụ
- Tạo một liên kết tượng trưng
my_script_link.shtrỏ đến tệp thực thi/usr/local/bin/my_script.sh:ln -s /usr/local/bin/my_script.sh my_script_link.sh - Để kiểm tra liên kết và xem nó trỏ đến đâu:
ls -l my_script_link.shKết quả sẽ hiển thị
my_script_link.sh -> /usr/local/bin/my_script.sh.
9. Tạo liên kết cứng (Hard Link)
Liên kết cứng là một tên tệp khác trỏ đến cùng một inode với tệp gốc. Điều này có nghĩa là tệp gốc và liên kết cứng hoàn toàn giống nhau, chia sẻ cùng một dữ liệu trên đĩa. Xóa một trong hai sẽ không ảnh hưởng đến cái còn lại, miễn là vẫn còn ít nhất một liên kết cứng trỏ đến inode đó.
Liên kết cứng chỉ có thể được tạo cho các tệp thông thường trong cùng một hệ thống tệp và không thể tạo cho thư mục.
9.1. Cú pháp cơ bản
ln [tệp_gốc] [tên_liên_kết_cứng]
9.2. Ví dụ
- Tạo một liên kết cứng
config_backup.inicho tệpconfig.ini:ln config.ini config_backup.ini - Để xác minh rằng cả hai tệp chia sẻ cùng một inode, bạn có thể sử dụng
ls -i:ls -i config.ini config_backup.iniBạn sẽ thấy cả hai tệp có cùng số inode, chứng tỏ chúng là các tên khác nhau của cùng một dữ liệu trên đĩa.