# 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*

> Source: GNU Findutils (gnu.org/software/findutils) · MIT

## 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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `-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

| Command | Description |
|---------|-------------|
| `-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

| Command | Description |
|---------|-------------|
| `-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

| Command | Description |
|---------|-------------|
| `-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

| Command | Description |
|---------|-------------|
| `-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ử

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `-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

| Command | Description |
|---------|-------------|
| `-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

| Command | Description |
|---------|-------------|
| `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' {} +` |
