Find command

Posted: March 3, 2011 by Hacking & Relax in Linux

Trong môi trường Linux, lệnh find được xếp vào hàng 1 trong những lệnh hữu dụng nhất. Lệnhfind được dùng để xác định vị trí file cần tìm. Thoạt nhìn có thể thấy lệnh find cũng chẳng hơn gì lệnh locate, nhưng xét một cách chi tiết thì lệnh find ưu điểm hơn ở chỗ user thường cũng sử dụng được và nó cung cấp 1 số tùy chọn điều khiển. Cách sử dụng find được nhắc đến nhiều ởman page, nhưng thú thực thì tôi cũng không khoái đọc ở đó lắm, nó hơi cấu trúc và khó hiểu. Lang thang trên mạng lại gặp được trang http://devdaily.com/unix/edu/examples/find.shtml, ở đó cung cấp những ví dụ trực quan hay sử dụng nhất với lệnh find. Tôi xin mạn phép dịch lại một số phần.

1. Tìm các file với lệnh find

Ví dụ đầu tiên này sẽ tìm các file có tên “Chapter1” nằm trong root /. Nếu tìm thấy in ra màn hình vị trí của file đó.

find / -name Chapter1 -type f

Câu lệnh find dưới đây sẽ tìm file “Chapter1” trong directory /usr và /home:

find /usr /home -name Chapter1 -type f

Nếu muốn tìm trong thư mục hiện tại có thể làm như sau:

find . -name Chapter1 -type f

Lưu ý là các lệnh trên sẽ tìm trong thư mục được nêu đến (/, /usr, /home) và tất cả các thư mục con của chúng. Các câu lệnh này sẽ chỉ tìm được file nào có tên đúng là Chapter1, còn nếu muốn tìm các file có cụm từ Chapter1 trong nó thì ta cần sử dụng đến ký tự mở rộng (đặc biệt cần lưu ý dấu nháy):

find . -name "*Chapter1*" -type f

2. Tìm thư mục với lệnh find

Tất cả các tùy chọn dùng với tìm file đều dùng được với tìm thư mục, chỉ việc thay -f bằng -d

3. Kết hợp find và grep

Giả sử bạn muốn tìm trong thư mục hiện tại các file có đuôi .java và trong nội dung file có cụm từStringBuffer chẳng hạn. Có nhiều cách để giải quyết vấn đề này, bạn có thể sử dụng pipeline qua lệnh find và grep, tuy nhiên find có cung cấp tùy chọn exec cho phép ta thực thi ngay mà không cần qua pipeline.

find . -name "*.java" -type f -exec grep -l StringBuffer {} \;

Trong đó tùy chọn -l sẽ chỉ in kết quả tên file mà không in nội dung phần có chứa từ StringBuffer. Nếu không quan tâm đến chữ hoa hay chữ thường ở từ StringBuffer thì thêm tùy chọn -i trong lệnh grep.

4. Sử dụng exec

Tùy chọn -exec là một tùy chọn rất hữu ích và khó hiểu của find. Trước đây khi muốn xử lý các file tìm được sau lệnh find người ta thường phải sử dụng pipeline. Nhược điểm của pipeline đó là hiện tượng tràn đối số với các lệnh như rmmv… Để khắc phục điều này người ta đưa thêm xargstrước lệnh thực thi, cơ chế của việc này là chia các đối số thành các block đối số và truyền vào lệnh thực thi, cứ như vậy cho đến khi hết đối số. Khi tùy chọn -exec được đưa ra thì nó đã giải quyết được triệt để vấn đề này, cơ chế của nó là truyền các đối số vào lệnh thực thi từng đối số một.

Lệnh dưới đây sẽ xóa đi các file có đuôi .mp3 chẳng hạn:

find . -name "*.mp3" -type f -exec rm {} \;

Cặp ngoặc nhọn {} chính là đối số truyền vào từ kết quả của find, cuối của tùy chọn -exec cần phải có dấu ; để kết thúc lệnh, và để hiên thị dấu ; thì sử dụng cú pháp \;.

Ví dụ sau sẽ move các file đuôi .java vào thư mục Java:

find . -name "*.java" -type f -exec mv {} Java \;

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s