Jun 18

Đôi lúc bạn cần tìm file gì gì đó trong hệ thống. Phải làm sao cho nhanh bằng command line?

1. Tìm 1 hoặc nhiều folder (directory) có chứa thuộc tính nào đó. Ví dụ tìm folder có thuộc tính là cả thế giới có quyền truy cập:

find . -type d -perm 777 -print

Tương tự, ta có thể tìm một hoặc nhiều file có thuộc tính nào đó.

find . -type f -perm 644 -print

2. Tìm một hoặc nhiều folder rồi làm gì đó với nó. Ví dụ ta tìm folders rồi gán quyền 755 lên nó:

find . -type d -exec chmod 755 {} \;

Tương tự ta làm với files:

find . -type f -exec chmod 644 {} \;

3. Nếu muốn làm gì gì đó trên một hoặc nhiều  folders hoặc files thì ta làm như vầy:

find . -type d -name ‘*nhan*’ -exec chmod 755 {} \;

find . -type f -name ‘*.htm*’ -exec chmod 644 {} \;

4. Tìm một hoặc nhiều files có tên chứa ký tự mà bạn muốn tìm:

find . -type f -name ‘*hack*’ -print

Từ đó bạn có thể phăng ra nhiều lệnh khác. Hoặc gõ:

man find

để đọc lè lưỡi luôn!

Mọi tnắc mắc, đóng góp, chê, cười, khen… vui lòng commnent vào dưới bài này. Thanks!

Tagged with:
Nov 16

Lệnh find:
Đầu tiên là tìm kiếm theo tên file: sử dụng tùy chọn -name, tùy chọn này chấp nhận các kí tự thay thế (meta-characters) và các biểu thức chính quy ( regex – regular expressions )
find . -name ‘*.nt’
find . -name ‘[Ss]*.nt’

Lệnh đầu tiên có cùng mục đích là tìm các file có đuôi ‘.nt’ trong folder hiện tại, lệnh thứ 2 tìm các file có tên bắt đầu là ‘s’ hoặc ‘S’ và kết thúc bằng ‘.nt’. Có thể bỏ “.” (current directory) bởi mặc định find sẽ tìm kiếm trong folder này.
Nên để pattern trong ” ‘ ‘ ” (single quote) để việc tìm kiếm chính xác hơn.
Tìm kiếm theo tên file có thêm một tùy chọn khác là -iname, tùy chọn này không phân biệt chữ hoa chữ thường (case insensitive). Khi đó thì kiếm pattern ‘foo’ thì sẽ các kết quả “Foo, FOO, fOo,…” cũng sẽ được chấp nhận.

Thứ hai là tìm kiếm theo kiểu file (looking for files by type): sử dụng đối số -type và theo sau là 1 trong các từ sau:
d Directory
f File
l Symbolic Link

find -type l
Và tất nhiên là có thể kết hợp với -name option.
find /bin -type l -name ‘*grep*’

Tiếp theo là tìm kiếm theo dung lượng chiếm giữ ( looking for file by sizes ): đối số -size.
Khuyên dùng những dạng dễ đọc như “Killobytes” “Megabytes” “Gigabytes” tương đương với “k” “M” “G”
Ví dụ tìm kiếm các file trong $HOME có dung lượng từ 10MB đến 20M
find $HOME -size +10M -size -20M

Tìm kiếm file theo thời gian: Có 3 tùy chọn chính là -mtime -atime và -ctime
-mtime thì kiếm theo thời gian sửa đổi, tùy chọn này không phân biệt thời gian sửa đổi và thời gian tạo.
-atime thì kiếm theo thời gian truy cập, theo man thì -atime sẽ không làm tốt nếu sử dụng kiếm folder, lúc đó sẽ dùng -ctime để thay thế. Nhưng mình vẫn chưa thấy sự khác nhau của -atime và -ctime. Tạm thời phần time này ghi chú nhiêu đấy thôi, để sau này có phát hiện mới sẽ bổ sung vào.

Tìm kiếm file theo quyền: -perm
Ở đây mình chỉ cần nhớ về quyền tính theo số.
Cú pháp: find -perm xxxx
Với xxxx là quyền chính xác của file, nếu thêm dấu “-” (minus) đằng trước thì sẽ tìm tất cả các file có quyền thấp nhất là xxxx, nếu sử dụng “+” (plus) thì tìm các file với quyền cao nhất là xxxx.

Tìm kiếm theo chủ sở hữu ( owner ) và nhóm ( group ): -user -group
Có thể tìm kiếm theo tên, hoặc theo số ID.
Có thêm 2 tùy chọn nữa là -nouser và -nogroup để kiếm những file mà không có chủ quyền (có thể là do user đã bị xóa khỏi hệ thống).

Sự khác nhau giữa -execxargs là -exec thực thi lệnh mỗi khi tìm thấy còn xargs sẽ thực thi vài file trong mỗi lần xử lý. Tuy nhiên có thể xargs gặp vấn đề với filename có chứa khoảng trắng (space).
So sánh tìm kiếm file mới hơn 1 file nào đó được chỉ định: -newer
Các biểu thức:
() để nhóm các biểu thức.
! và -not có cùng công dụng, phủ định kết quả. -not không tuân theo chuẩn POSIX
-a -and , 2 biểu thức liên tiếp cách nhau bởi khoảng trắng, kết quả tìm kiếm phải đúng với cả 2 biểu thức
-o -or, kết quả tìm kiếm đúng 1 trong 2 biểu thức.

Lệnh locate:
Lệnh này dùng để tìm kiếm theo tên, nhanh hơn rất nhiều so với find do đã được index sẵn lúc khởi động, vì vậy các thay đổi gần đây chưa được index thì có thể sẽ hiển thị kết quả sai. Để kiếm chính xác hơn tính đến thời điểm hiện tại thì sử dụng lệnh updatedb.
Ví dụ để tìm các source file của c: locate *.c

Để biết thêm chi tiết vui lòng đọc manpage.

Tagged with:
preload preload preload