Lệnh find trong Linux — Cách tìm kiếm file và thư mục

Bạn đã bao giờ rơi vào tình huống dở khóc dở cười khi cần tìm gấp một file log quan trọng giữa hàng triệu tệp tin trên hệ thống VPS nhưng lại chẳng nhớ nổi nó nằm ở đâu chưa nhỉ? Với tư cách là một Senior System Admin, mình từng phải xử lý những sự cố khẩn cấp chỉ bằng cách truy quét các file rác chiếm dụng dung lượng lớn để cứu vãn server kịp thời, và đó chính là lúc sức mạnh của find được thể hiện rõ rệt nhất.

Vậy thực chất find là gì? Hiểu một cách đơn giản, find là một công cụ tìm kiếm cực kỳ mạnh mẽ trên Linux, cho phép bạn tìm kiếm file và thư mục dựa trên rất nhiều tiêu chí khác nhau như tên, kích thước, thời gian hay quyền truy cập. Trong bài viết này, mình sẽ cùng bạn khám phá cách dùng find một cách chuyên sâu nhất, từ những câu lệnh cơ bản đến các kỹ thuật nâng cao. Tất nhiên, việc nắm vững cách tìm kiếm file bằng lệnh này sẽ giúp công việc quản trị hệ thống của bạn trở nên vô cùng nhẹ nhàng và hiệu quả, đúng không nào?

Cần chuẩn bị gì trước khi dùng lệnh find?

  • Quyền user: Có thể sử dụng với user thường, tuy nhiên cần quyền sudo hoặc root để tìm kiếm trong các thư mục hệ thống nhằm tránh lỗi Permission denied.
  • Distro/OS hỗ trợ: Hoạt động trên hầu hết các hệ điều hành dựa trên Unix như Linux (Ubuntu, Debian, CentOS, RHEL, Arch Linux...) và macOS.
  • Package dependencies: Lệnh find thuộc gói findutils và thường được cài đặt sẵn mặc định trên hầu hết các bản phân phối Linux.
  • Version tối thiểu: Không yêu cầu phiên bản cụ thể, hoạt động ổn định trên các phiên bản GNU findutils hiện đại.

Cú pháp lệnh find là gì?

Lệnh find hỗ trợ nhiều dạng cú pháp khác nhau trên các hệ thống Linux/Unix để tìm kiếm tệp và thư mục dựa trên các tiêu chí cụ thể.

find [PATH...] [EXPRESSION]
find [PATH...] [OPTION] [ACTION]

Các tùy chọn của lệnh find là gì?

Lệnh find cung cấp nhiều tùy chọn để tìm kiếm, lọc và xử lý tập tin theo tiêu chí khác nhau như tên, loại, kích thước, quyền hạn và thời gian sửa đổi.

Tùy chọn ngắn Tùy chọn dài Mô tả
-name find -name tìm kiếm tập tin theo tên chính xác hoặc mẫu ký tự đại diện (*, ?, []).
-iname find -iname tìm kiếm theo tên tập tin không phân biệt chữ hoa, chữ thường.
-type find -type lọc theo loại tập tin: f (tập tin thường), d (thư mục), l (liên kết tượng trưng), s (socket), b (tập tin khối), c (tập tin ký tự).
-size find -size tìm kiếm theo kích thước tập tin với các đơn vị: c (byte), k (kilobyte), M (megabyte), G (gigabyte).
-mtime find -mtime tìm kiếm tập tin dựa trên thời gian sửa đổi (tính bằng ngày).
-mmin find -mmin tìm kiếm tập tin dựa trên thời gian sửa đổi (tính bằng phút).
-atime find -atime tìm kiếm tập tin dựa trên thời gian truy cập cuối cùng (tính bằng ngày).
-ctime find -ctime tìm kiếm tập tin dựa trên thời gian thay đổi i-node (tính bằng ngày).
-perm find -perm tìm kiếm tập tin theo quyền hạn cụ thể (ví dụ: 644, 755).
-user find -user tìm kiếm tập tin sở hữu bởi một người dùng cụ thể.
-group find -group tìm kiếm tập tin sở hữu bởi một nhóm cụ thể.
-depth find -depth xử lý nội dung thư mục trước khi xử lý thư mục chính nó (tương tự postorder traversal).
--maxdepth find --maxdepth giới hạn độ sâu tìm kiếm đến số mức thư mục chỉ định.
--mindepth find --mindepth bắt đầu tìm kiếm từ số mức thư mục tối thiểu chỉ định.
-exec find -exec thực thi một lệnh đối với mỗi tập tin tìm thấy, kết thúc bằng dấu chấm phẩy (;).
-ok find -ok tương tự -exec nhưng yêu cầu xác nhận từ người dùng trước khi thực thi lệnh.
-print find -print in đường dẫn tập tin tìm thấy ra màn hình (hành động mặc định).
-print0 find -print0 in đường dẫn tập tin được phân tách bằng ký tự null thay vì dòng mới.
-delete find -delete xóa các tập tin tìm thấy (cần sử dụng cẩn thận).
--empty find --empty tìm kiếm các tập tin hoặc thư mục rỗng (kích thước 0 byte).
-readable find -readable tìm kiếm các tập tin mà người dùng hiện tại có quyền đọc.
-writable find -writable tìm kiếm các tập tin mà người dùng hiện tại có quyền ghi.
-executable find -executable tìm kiếm các tập tin mà người dùng hiện tại có quyền thực thi.
-path find -path tìm kiếm theo đường dẫn đầy đủ của tập tin, hỗ trợ ký tự đại diện.
-ipath find -ipath tìm kiếm theo đường dẫn không phân biệt chữ hoa, chữ thường.
-prune find -prune loại trừ các thư mục khỏi tìm kiếm tiếp theo.
-o find -o là toán tử logic OR để kết hợp nhiều điều kiện tìm kiếm.
-and find -and là toán tử logic AND để kết hợp nhiều điều kiện (mặc định nếu không chỉ định).
-not find -not là toán tử logic NOT để phủ định một điều kiện tìm kiếm.
! find ! là dạng viết tắt của toán tử -not.

xem thêm: Basic File and Directory Operations

Cách sử dụng lệnh find trong các tình huống thực tế?

Phần dưới đây trình bày các kịch bản ứng dụng lệnh find phổ biến mà quản trị viên hệ thống thường gặp trong quá trình vận hành.

find là gì? [Tìm kiếm tệp tin trong thư mục hiện tại]

find .
.
./file1.txt
./dir1
./dir1/file2.txt

Lệnh liệt kê tất cả các tệp và thư mục con từ vị trí hiện tại. Trong thực tế, đây là cách nhanh nhất để kiểm tra cấu trúc thư mục khi bạn không nhớ rõ sơ đồ phân cấp.

find -name là gì? [Tìm tệp tin theo tên cụ thể]

find /home/user -name "config.yaml"
/home/user/projects/app/config.yaml

Tìm chính xác tệp tin có tên là config.yaml trong thư mục /home/user. Trên môi trường production, việc này giúp xác định nhanh vị trí của các tệp cấu hình khi ứng dụng gặp lỗi.

find -type và -mtime là gì? [Tìm tệp cũ để dọn dẹp hệ thống]

find /var/log -type f -mtime +30
/var/log/syslog.1
/var/log/auth.log.2

Tìm các tệp tin (type f) đã không được sửa đổi trong hơn 30 ngày qua. Đây là kịch bản quan trọng để thiết lập các tác vụ tự động xóa log cũ nhằm tránh đầy dung lượng ổ cứng.

find -size và -exec là gì? [Tìm và xóa tệp lớn tự động]

find /tmp -type f -size +100M -exec rm -f {} \;

Tìm các tệp tin lớn hơn 100MB và thực hiện lệnh xóa trực tiếp lên chúng. Trong các tình huống khẩn cấp khi máy chủ hết dung lượng, lệnh này cho phép bạn giải phóng không gian lưu trữ một cách nhanh chóng.

find kết hợp grep là gì? [Tìm tệp chứa nội dung văn bản cụ thể]

find ./src -name "*.py" | xargs grep "import os"
./src/main.py:import os
./src/utils/helper.py:import os

Kết hợp tìm kiếm các tệp Python và lọc ra những tệp có chứa từ khóa "import os". Đây là kỹ thuật nâng cao giúp lập trình viên rà soát mã nguồn hoặc tìm kiếm các tham chiếu cấu hình trong các dự án lớn.

Tại sao lệnh find không tìm thấy file hoặc báo lỗi Permission denied?

Dưới đây là các tình huống thực tế thường gặp khi sử dụng lệnh find trong quá trình quản trị hệ thống Linux.

Lỗi không có quyền truy cập vào các thư mục hệ thống

find /root -name "config.conf"
find: ‘/root’: Permission denied

Lỗi xảy ra khi người dùng không có quyền đọc (read) hoặc thực thi (execute) trên thư mục mục tiêu, khiến lệnh không thể quét qua các thư mục con.

Lỗi không tìm thấy kết quả do sai lệch cú pháp tìm kiếm

find /var/log -name mylog.log
find: -name: no predicate given

Lỗi này thường xuất hiện khi thiếu các tham số bổ trợ hoặc viết sai cú pháp của các flag, khiến lệnh find không thể xác định được điều kiện lọc.

Lỗi tìm kiếm file có chứa ký tự đặc biệt hoặc khoảng trắng

find . -name *.txt
find: error writing to standard output

Khi không sử dụng dấu ngoặc kép bao quanh pattern, shell sẽ thực hiện quá trình globbing trước khi truyền vào lệnh find, dẫn đến kết quả sai lệch hoặc lỗi nếu có nhiều file khớp với pattern trong thư mục hiện hành.

Lỗi không tìm thấy file do nhầm lẫn giữa chữ hoa và chữ thường

find /home/user -name "Document.pdf"
(Không trả về kết quả nào)

Lệnh find mặc định phân biệt chữ hoa và chữ thường, do đó sẽ không trả về kết quả nếu tên file thực tế là "document.pdf".

Quy trình thực tế dùng find trong quản lý hệ thống Linux?

Trong quá trình bảo trì server, lệnh find thường được kết hợp cùng các lệnh khác để thực hiện các tác vụ dọn dẹp log hoặc phân quyền hàng loạt.

Bước 1: Xác định các tệp tin rác hoặc log cũ để giải phóng dung lượng

find /var/log -name "*.log" -mtime +30
/var/log/syslog.1
/var/log/auth.log.2

Lệnh cho phép bạn liệt kê các tệp tin có đuôi .log đã được chỉnh sửa lần cuối cách đây hơn 30 ngày.

Bước 2: Kiểm tra dung lượng các tệp tin vừa tìm thấy

find /var/log -name "*.log" -mtime +30 -exec du -sh {} \;
4.0K /var/log/syslog.1
12K /var/log/auth.log.2

Sử dụng tham số -exec để kết hợp với lệnh du, giúp bạn kiểm tra kích thước cụ thể của từng tệp tin trước khi thực hiện xóa.

Bước 3: Thực hiện xóa các tệp tin sau khi đã xác nhận

find /var/log -name "*.log" -mtime +30 -delete

Tham số -delete cho phép bạn xóa trực tiếp các tệp tin thỏa mãn điều kiện tìm kiếm để hoàn tất quy trình dọn dẹp.

Bước 4: Kiểm tra lại trạng thái hệ thống sau khi dọn dẹp

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   20G   30G  40% /

Sử dụng lệnh df -h để kiểm tra lại dung lượng đĩa trống sau khi các tệp tin cũ đã được loại bỏ.

Việc sử dụng lệnh find trên VPS đòi hỏi sự chính xác về cú pháp để tránh gây quá tải tài nguyên hệ thống. Khi thực hiện tìm kiếm trên các ổ đĩa có dung lượng lớn, việc thiếu tham số -maxdepth dẫn đến quá trình quét toàn bộ cấu trúc thư mục, gây tiêu tốn CPU và I/O. Trong các trường hợp quản trị VPS, người dùng thường gặp lỗi không tìm thấy file do sai lệch giữa quyền sở hữu (ownership) và quyền truy cập (permissions). Để xử lý, lệnh find cần kết hợp với sudo để đảm bảo quyền quét các thư mục hệ thống. Ví dụ, lệnh sudo find /var/log -name "*.log" cho phép truy cập các file nhật ký bị hạn chế. Ngoài ra, việc sử dụng các biểu thức chính quy (regex) không chuẩn xác trong lệnh find dẫn đến kết quả trả về rỗng hoặc sai lệch dữ liệu. Người dùng nên kiểm tra kỹ cấu trúc đường dẫn trước khi thực thi trên môi trường VPS production.

Những câu hỏi thường gặp về lệnh find?

Dưới đây là các tình huống phổ biến mà người dùng thường gặp phải khi sử dụng lệnh find để tìm kiếm tệp tin và thư mục.

Làm thế nào để tìm một tệp tin theo tên chính xác?

Sử dụng tham số -name để tìm kiếm tệp tin khớp hoàn toàn với tên được chỉ định.

find /home/user -name "config.txt"
/home/user/documents/config.txt

Cách tìm kiếm tệp tin mà không phân biệt chữ hoa chữ thường?

Tham số -iname cho phép thực hiện tìm kiếm không phân biệt giữa chữ hoa và chữ thường.

find . -iname "readme.txt"
./README.TXT
./readme.txt

Làm sao để chỉ tìm kiếm các thư mục thay vì tệp tin?

Sử dụng tham số -type cùng với giá trị d (directory) để lọc kết quả trả về là thư mục.

find /var/log -type d
/var/log/apache2
/var/log/mysql

Cách tìm các tệp tin có kích thước lớn hơn một giá trị cụ thể?

Tham số -size kết hợp với ký tự + cho phép bạn tìm các tệp tin lớn hơn mức dung lượng mong muốn.

find /home -size +100M
/home/user/video.mp4

Làm thế nào để tìm tệp tin được chỉnh sửa trong vòng 24 giờ qua?

Tham số -mtime kết hợp với giá trị -1 giúp tìm các tệp tin có thời gian sửa đổi gần nhất.

find /tmp -mtime -1
/tmp/session_data.tmp

Cách tìm và xóa tất cả các tệp tin có phần mở rộng nhất định?

Bạn có thể kết hợp lệnh find với tham số -delete để tự động loại bỏ các tệp tin thỏa mãn điều kiện.

find . -name "*.tmp" -delete

Làm sao để tìm tệp tin và thực hiện một lệnh khác trên chúng?

Tham số -exec cho phép bạn chạy một lệnh tùy chỉnh trên mỗi kết quả tìm thấy.

find . -name "*.log" -exec ls -lh {} \;
-rw-r--r-- 1 user user 1.2K Oct 10 10:00 ./error.log

Lệnh find là một công cụ tìm kiếm mạnh mẽ giúp bạn truy quét các tệp tin và thư mục trong hệ thống Linux dựa trên nhiều tiêu chí khác nhau. Bạn có thể vô cùng dễ dàng lọc các tệp theo tên bằng tham số -name hoặc tìm kiếm những nội dung được chỉnh sửa gần đây thông qua -mtime, đúng không nhỉ? Việc kết hợp linh hoạt các tham số này chắc chắn sẽ giúp bạn tiết kiệm rất nhiều thời gian khi quản lý dữ liệu phức tạp. Hy vọng những kiến thức vừa rồi sẽ giúp ích cho công việc của bạn. Chúc bạn thành công!