Chuyển đến nội dung chính (Skip to content)
Mục lục bài viết
Linux Essentials

Linux Essentials 2.3: Tệp, thư mục và đường dẫn

Linux Essentials 2.3: Tệp, thư mục và đường dẫn

Thực hành đường dẫn Linux: phân biệt tuyệt đối và tương đối, xem tệp ẩn, tìm theo tên và đọc đường dẫn logic, vật lý trong cây dữ liệu giả lập.

Cùng một tên tệp nhưng bạn đang đứng ở đâu

Một ticket ghi “không tìm thấy report.txt”, trong khi người dùng vừa nhìn thấy tệp đó ở cửa sổ khác. Trước khi xét quyền hay ổ đĩa, hãy hỏi chương trình đang dùng đường dẫn nào và thư mục làm việc ở đâu. Tên tệp giống nhau có thể xuất hiện ở nhiều thư mục; một đường dẫn tương đối chỉ có nghĩa khi biết điểm xuất phát.

Bài đối chiếu mục tiêu 2.3 của PDF 010-160, trang in 113–141, trang PDF vật lý 122–150. Phần cập nhật liên hệ mục tiêu 012.3 của 010-200, có tìm tệp theo tên bằng find. Mốc biên tập 23/10/2026. Kết quả cần đạt là đọc cây thư mục, điều hướng, thấy tệp ẩn và giải thích đường dẫn. Lab dùng Bash cùng coreutils và GNU findutils của image Ubuntu, trong thư mục tạm tự tạo.

Trong image Ubuntu 26.04.1 đã kiểm tra, ls là bản uutils 0.10.0. Các ví dụ trong bài đã chạy trên bản này; không mặc định mọi tùy chọn GNU đều có cùng hành vi. Tài liệu uutils ls là nguồn bổ sung, nhưng cần đối chiếu phiên bản cài thực tế.

Thư mục gốc, home và thư mục làm việc

Dấu / ở đầu đường dẫn chỉ thư mục gốc của cây mà tiến trình đang nhìn thấy. /home thường chứa home của tài khoản trên nhiều bản phân phối; vị trí cụ thể có thể khác. HOME là biến mô tả home của tài khoản trong phiên. Dấu ~ trong cú pháp shell có thể được mở rộng đến home, nhưng chuỗi "~" bên trong nháy kép không thực hiện tilde expansion theo cách tương tự.

Thư mục làm việc là trạng thái của tiến trình. Với shell tương tác, cd thay đổi trạng thái đó; các lệnh tiếp theo thường kế thừa nó. Mở hai terminal rồi cd ở một cửa sổ không tự đổi thư mục của cửa sổ kia. Đây là nguyên nhân phổ biến khiến hai người dùng cùng một lệnh tương đối nhưng đọc hai tệp khác nhau.

pwd
printf '%s\n' "$HOME"
printf '%s\n' ~
printf '%s\n' "~"

Ba phép printf giúp phân biệt giá trị biến, tilde expansion và ký tự thường. Không sửa HOME để “chuyển nơi làm việc”; dùng cd với đường dẫn phù hợp. HOME được nhiều chương trình dùng để tìm cấu hình, nên thay nó có thể gây tác động ngoài mục đích điều hướng.

Tạo cây dữ liệu có ranh giới rõ ràng

Khối sau tạo thư mục mới bằng mktemp, rồi đặt dữ liệu giả lập bên trong. Đường dẫn được lưu vào lpi_paths; giữ cùng phiên shell cho các bước tiếp theo. Không thay đường dẫn đó bằng thư mục công việc chứa dữ liệu thật. Bài không yêu cầu dọn bằng rm -rf ở cuối.

lpi_paths=$(mktemp -d)
mkdir -p -- "$lpi_paths/team/reports" "$lpi_paths/personal"
printf '%s\n' 'Báo cáo nhóm giả lập' > "$lpi_paths/team/reports/report.txt"
printf '%s\n' 'Báo cáo cá nhân giả lập' > "$lpi_paths/personal/report.txt"
printf '%s\n' 'Ghi chú ẩn giả lập' > "$lpi_paths/team/.note"
printf '%s\n' "$lpi_paths"

mktemp -d tạo một thư mục riêng với tên không đoán trước theo cách triển khai của hệ thống. Các dấu > tạo nội dung; trong cách dùng chung chúng có thể ghi đè tệp tồn tại, vì vậy bài đặt chúng trong thư mục mới. mkdir -p tạo thư mục cha cần thiết. Những lệnh này là thiết lập lab, không phải yêu cầu tạo cấu trúc tương tự trong /etc hoặc thư mục ứng dụng.

Hai tệp report.txt có cùng tên cuối nhưng nằm ở hai nhánh khác nhau.
Hình 2. Hai tệp report.txt có cùng tên cuối nhưng nằm ở hai nhánh khác nhau. Mở hình để xem chi tiết.

Đường dẫn tuyệt đối và tương đối

Đường dẫn bắt đầu bằng / là tuyệt đối trong cây hiện tại. Đường dẫn không bắt đầu bằng / thường được diễn giải từ thư mục làm việc. Dấu . chỉ thư mục hiện tại và .. chỉ thư mục cha trong thao tác điều hướng thông thường. Hiểu quan hệ này giúp bạn dự đoán nơi một chương trình sẽ mở dữ liệu.

cd -- "$lpi_paths/team"
pwd
cat reports/report.txt
cat "$lpi_paths/personal/report.txt"
cd -- "$lpi_paths/personal"
cat report.txt

Lần đọc đầu đi từ team đến reports bằng đường dẫn tương đối. Lần đọc thứ hai dùng đường dẫn tuyệt đối được tạo từ biến lpi_paths. Sau khi chuyển sang personal, report.txt là tệp cá nhân. Cùng tên cuối không chứng minh cùng đối tượng. Hãy ghi nội dung và vị trí tương ứng vào ghi chú thay vì kết luận chỉ từ việc cat không báo lỗi.

Đường dẫn tuyệt đối giúp giảm phụ thuộc thư mục làm việc, nhưng không bảo đảm tệp tồn tại hoặc đáng tin. Symlink, mount và namespace vẫn có thể ảnh hưởng cây mà tiến trình thấy. Trong container, / là gốc môi trường container; nó không mặc định là gốc của hệ điều hành desktop host.

Liệt kê tệp và nhận biết nội dung ẩn

ls mặc định thường bỏ qua tên bắt đầu bằng dấu chấm. Điều đó chỉ ảnh hưởng cách liệt kê, không phải cơ chế giữ bí mật. Một người có quyền đọc phù hợp vẫn có thể truy cập tệp .note khi chỉ đúng tên. Đừng lưu thông tin nhạy cảm rồi nghĩ đổi tên bắt đầu bằng dấu chấm đã bảo vệ nó.

cd -- "$lpi_paths/team"
ls
ls -a
ls -ld -- . reports

ls -a hiển thị cả tên ẩn và các mục . cùng ... Ở lệnh cuối, -d làm ls hiển thị chính các thư mục được nêu thay vì liệt kê nội dung bên trong, còn -l chọn dạng dài. Dấu -- được ls trong lab dùng để kết thúc phần tùy chọn; sau đó các đối số được xử lý như tên. Kiểm tra tài liệu chương trình khi chuyển sang công cụ có cú pháp khác.

Quyền trong đầu ra dài sẽ được học kỹ ở chặng sau. Ở đây chỉ cần thấy một listing trống chưa chứng minh thư mục không có gì. Nếu đang điều tra tệp cấu hình, nội dung ẩn là một khả năng phải kiểm tra trước khi tạo một tệp mới trùng mục đích.

Quy trình kiểm tra ít tác động khi không tìm thấy tệp.
Hình 1. Quy trình kiểm tra ít tác động khi không tìm thấy tệp. Mở hình để xem chi tiết.

Tìm theo tên mà không để shell mở rộng mẫu trước

Mục tiêu hiện hành bổ sung nhận biết find để tìm tên tệp. Trong khối dưới, phạm vi tìm được giới hạn ở cây lab. Nháy đơn quanh *.txt giữ mẫu cho find diễn giải, thay vì để Bash mở rộng nó theo nội dung thư mục đang đứng.

find "$lpi_paths" -type f -name '*.txt' -print

Bạn dự kiến thấy hai report.txt ở hai nhánh. Thứ tự hiển thị không phải cam kết của bài; so sánh tập đường dẫn, không phụ thuộc thứ tự. -type f lọc tệp thường; symlink và thư mục không được tính giống hệt. Việc đọc toàn bộ máy từ / có thể chậm và gặp lỗi quyền, nên không dùng nó làm bước đầu cho một ca chỉ liên quan đến thư mục dự án nhỏ.

Đừng thêm -delete hoặc -exec từ một hướng dẫn khác vào lệnh tìm chỉ đọc này. Những tùy chọn đó có thể chuyển hoạt động quan sát thành thay đổi dữ liệu hoặc thực thi chương trình. Bài chỉ cần -print để xác nhận nơi có tên phù hợp. Cách GNU find xử lý biểu thức là nguồn tham khảo khi bạn muốn mở rộng.

Symlink là một loại tệp đặc biệt chứa đường dẫn tham chiếu đến đối tượng khác. Đi qua symlink khiến cách trình bày đường dẫn của shell có thể khác đường dẫn vật lý sau phân giải. Phần tạo và quản lý liên kết được học riêng; ở đây dùng một liên kết do lab tạo để quan sát mà không sửa dữ liệu đích.

ln -s -- "$lpi_paths/team/reports" "$lpi_paths/reports-link"
cd -- "$lpi_paths/reports-link"
pwd -L
pwd -P

pwd -L dự kiến giữ tên reports-link trong đường dẫn logic của Bash nếu PWD hợp lệ. pwd -P phân giải liên kết thư mục và cho đường dẫn vật lý. Nếu thư mục tạm của hệ thống cũng nằm sau symlink, các thành phần khác có thể thay đổi thêm. Đó là lý do phép kiểm tra nên xem quan hệ đích, không so toàn bộ chuỗi với một đường dẫn tuyệt đối cố định trên máy khác.

Không coi symlink là bản sao lưu. Nó không lưu thêm một bản nội dung; đích có thể đổi hoặc biến mất. Khi ứng dụng mở tệp qua liên kết, kết quả vẫn phụ thuộc đích và quyền liên quan. Tài liệu GNU pwd giải thích khác biệt các chế độ; Bash builtin có trang trợ giúp riêng để đối chiếu trong phiên.

Lỗi thường gặp và cách kiểm tra ít tác động

Nếu cat báo No such file or directory, đọc pwd và ls -a trong phạm vi liên quan, rồi kiểm tra chính tả và chữ hoa/chữ thường. Trên filesystem Linux thường dùng, report.txt và Report.txt có thể là hai tên khác; không áp dụng một quy tắc cố định cho mọi filesystem được mount. Tên có khoảng trắng cần được quote như bài shell trước.

Nếu nhận Permission denied, dừng ở việc xác định thành phần đường dẫn và quyền hiện có. Chưa dùng chmod -R hoặc sudo như một cách sửa mặc định. Thư mục cha cũng có thể hạn chế đi qua, dù tên tệp cuối trông đúng. Thu thập bằng chứng để phân biệt thiếu tệp, sai đường dẫn và thiếu quyền; ba tình huống cần cách xử lý khác nhau.

Tự đánh giá và giữ dữ liệu học tập

Bài tập 1: Đứng ở personal, hãy dự đoán đường dẫn tương đối đi tới tệp báo cáo nhóm. Đáp án là ../team/reports/report.txt trong cây đã tạo. Bài tập 2: ls không thấy .note có chứng minh nó đã bị xóa? Không; cần xem tệp ẩn và kiểm tra đúng thư mục.

Bài tập 3: Vì sao quote '*.txt' trong find? Để mẫu được truyền nguyên cho find xử lý. Bài tập 4: pwd -L khác pwd -P có luôn là lỗi? Không; một khác biệt có thể do symlink. Bạn đạt bài khi giải thích được cả bốn câu và đọc đúng hai report.txt theo hai nhánh.

Giữ đường dẫn lab và kết quả ghi chú cho buổi sau. Nếu đóng shell, biến lpi_paths sẽ không tự tồn tại trong phiên mới; dùng đường dẫn đã ghi thay vì đoán hoặc chạy lại khối tạo dữ liệu rồi trộn kết quả. Việc dọn tệp sẽ được học ở mục thao tác tệp với kiểm tra đích rõ ràng.

Bài liên quan trong bộ LPI

Tìm hiểu thêm