THAM KHẢO NHANH FIND
Tìm kiếm file theo tên, loại, kích thước, thời gian, quyền và hành động
Tìm Kiếm Cơ Bản
Chạy find
find . # list all files recursively
find /var/log # search from specific path
find . -name "*.txt" # find by name
find / -name "config" 2>/dev/null # suppress permission errors
find dir1 dir2 -name "*.py" # search multiple directories
Tổng Quan Cú Pháp
| find [path...] [tests] [actions] | Dạng tổng quát — đường dẫn, tiêu chí, rồi hành động |
| path | Thư mục bắt đầu (mặc định: thư mục hiện tại) |
| test | Điều kiện lọc file (-name, -type, v.v.) |
| action | Hành động với kết quả khớp (-print, -exec, v.v.) |
| Default action | -print nếu không chỉ định hành động |
Mẫu Tên
Khớp Tên
find . -name "*.log" # case-sensitive glob
find . -iname "readme*" # case-insensitive glob
find . -name "*.py" -o -name "*.js" # OR: Python or JS files
find . -path "*/src/*.ts" # match against full path
find . -regex '.*\.\(py\|js\)' # POSIX regex on full path
Tiêu Chí Tên
| -name pattern | Tên file khớp glob shell (phân biệt hoa thường) |
| -iname pattern | Tên file khớp glob (không phân biệt hoa thường) |
| -path pattern | Đường dẫn đầy đủ khớp glob shell |
| -ipath pattern | Đường dẫn đầy đủ khớp glob (không phân biệt hoa thường) |
| -regex pattern | Đường dẫn đầy đủ khớp biểu thức chính quy |
| -iregex pattern | Đường dẫn đầy đủ khớp regex (không phân biệt hoa thường) |
Lọc Theo Loại
Lọc Theo Loại File
find . -type f # regular files only
find . -type d # directories only
find . -type l # symbolic links
find . -type f -name "*.sh" # combine type + name
Các Loại File
| -type f | File thông thường |
| -type d | Thư mục |
| -type l | Symbolic link |
| -type b | Block device |
| -type c | Character device |
| -type p | Named pipe (FIFO) |
| -type s | Socket |
| -empty | File hoặc thư mục rỗng |
Kích Thước & Thời Gian
Ví Dụ Kích Thước & Thời Gian
find . -size +100M # larger than 100 MB
find . -size -1k # smaller than 1 KB
find . -mtime -7 # modified in last 7 days
find . -mmin -30 # modified in last 30 minutes
find . -newer reference.txt # newer than reference file
Tiêu Chí Kích Thước & Thời Gian
| -size +/-Nc | Kích thước theo byte (c), kilobyte (k), megabyte (M), gigabyte (G) |
| -mtime +/-N | Được sửa đổi N*24 giờ trước (+cũ hơn, -mới hơn) |
| -atime +/-N | Được truy cập N*24 giờ trước |
| -ctime +/-N | Trạng thái thay đổi N*24 giờ trước |
| -mmin +/-N | Được sửa đổi N phút trước |
| -newer file | Được sửa đổi gần đây hơn file tham chiếu |
| -newermt date | Được sửa đổi sau chuỗi ngày (GNU) |
Quyền Truy Cập
Ví Dụ Quyền
find . -perm 644 # exact permissions: rw-r--r--
find . -perm -u+x # user has execute bit set
find . -perm /o+w # others have write (any match)
find . -user root # owned by root
find . -group www-data -type f # owned by group
Tiêu Chí Quyền
| -perm mode | Khớp quyền chính xác |
| -perm -mode | Tất cả bit quyền chỉ định đều được bật |
| -perm /mode | Bất kỳ bit quyền chỉ định nào được bật |
| -user name | Thuộc sở hữu của user (tên hoặc UID) |
| -group name | Thuộc sở hữu của group (tên hoặc GID) |
| -nouser | Không có user khớp trong /etc/passwd |
| -nogroup | Không có group khớp trong /etc/group |
Hành Động
Ví Dụ Hành Động
find . -name "*.log" -print # print paths (default)
find . -name "*.tmp" -delete # delete matching files
find . -type f -ls # detailed listing
find . -name "*.txt" -print0 # null-delimited output
find . -type f -printf "%p %s\n" # custom format (GNU)
Tham Khảo Hành Động
| -print | In đường dẫn (phân cách bởi newline) |
| -print0 | In đường dẫn (phân cách null, an toàn cho xargs) |
| -ls | In chi tiết file (như ls -dils) |
| -delete | Xóa file khớp (ngụ ý -depth) |
| -printf format | Định dạng output tùy chỉnh (GNU): %p đường dẫn, %s kích thước, %t thời gian |
| -fprint file | Ghi đường dẫn vào file |
| -quit | Thoát sau kết quả đầu tiên |
Kết Hợp Tiêu Chí
Toán Tử Logic
find . -name "*.py" -type f # implicit AND
find . -name "*.py" -a -size +10k # explicit AND
find . -name "*.py" -o -name "*.js" # OR
find . ! -name "*.log" # NOT
find . \( -name "*.py" -o -name "*.js" \) -type f
Tham Khảo Toán Tử
| expr1 expr2 / expr1 -a expr2 | AND — cả hai phải đúng (mặc định) |
| expr1 -o expr2 | OR — một trong hai phải đúng |
| ! expr / -not expr | NOT — phủ định biểu thức |
| \( expr \) | Nhóm biểu thức (thoát dấu ngoặc trong shell) |
| Evaluation order | Trái sang phải; -a liên kết chặt hơn -o |
Exec & Delete
Ví Dụ Exec
find . -name "*.sh" -exec chmod +x {} \;
find . -name "*.log" -exec rm {} +
find . -type f -exec grep -l "TODO" {} +
find . -name "*.bak" -ok rm {} \; # prompt before each
find . -name "*.tmp" -print0 | xargs -0 rm
Tham Khảo Exec
| -exec cmd {} \; | Chạy cmd một lần mỗi file ({} = đường dẫn file) |
| -exec cmd {} + | Chạy cmd với nhiều file cùng lúc (nhanh hơn) |
| -ok cmd {} \; | Như -exec nhưng hỏi xác nhận trước |
| -execdir cmd {} \; | Chạy cmd từ thư mục chứa file |
| xargs -0 | Dùng kết hợp với -print0 để xử lý hàng loạt an toàn |
| -delete | Xóa file; xử lý từ trong ra ngoài |
Độ Sâu & Pruning
Ví Dụ Độ Sâu & Prune
find . -maxdepth 1 -type f # current dir only
find . -mindepth 2 -name "*.py" # skip top-level
find . -name ".git" -prune -o -print # skip .git dirs
find . -depth -name "*.tmp" -delete # process children first
Tùy Chọn Độ Sâu
| -maxdepth N | Đi xuống tối đa N cấp (0 = chỉ đường dẫn bắt đầu) |
| -mindepth N | Không áp dụng tiêu chí ở cấp nhỏ hơn N |
| -depth | Xử lý nội dung thư mục trước khi xử lý chính nó |
| -prune | Không đi sâu vào thư mục khớp |
| -mount / -xdev | Không vượt qua ranh giới filesystem |
| -follow / -L | Theo dõi symbolic link |
Mẫu Phổ Biến
One-Liners
find . -name "*.pyc" -delete # clean Python bytecode
find . -type f -size 0 -delete # remove empty files
find . -mtime +30 -name "*.log" -delete # purge old logs
find . -type f -name "*.md" | wc -l # count Markdown files
find . -type d -empty -delete # remove empty dirs
Công Thức
| Find largest files | find . -type f -printf '%s %p\n' | sort -rn | head |
| Find duplicates by name | find . -type f | awk -F/ '{print $NF}' | sort | uniq -d |
| Rename extension | find . -name '*.txt' -exec rename 's/.txt/.md/' {} + |
| Find broken symlinks | find . -xtype l |
| Archive recent files | find . -mtime -7 -print0 | tar czf recent.tar.gz --null -T - |
| Search code files | find . -name '*.py' -exec grep -l 'pattern' {} + |