5 tháng 3, 2010

Find command

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ệnh find đượ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 /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 findgrep

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 findgrep, 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ư rm, mv... Để khắc phục điều này người ta đưa thêm xargs trướ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 \;

=-=-=-=-=
Powered by Blogilo

Không có nhận xét nào:

Đăng nhận xét