+4

Cùng tìm hiểu find command trong Linux

Nếu bạn đang sử dụng Linux và muốn tìm kiếm một thứ gì đó trong ổ cứng mà không nhớ nó ở đâu, tên cụ thể nó là gì hay đơn giản là có quá nhiều file khá giống nhau mà bạn chỉ cần những file match với điều kiện của bạn ... nhưng bạn chưa biết làm thế nào thì có thể bài này sẽ rất hữu ích cho bạn. Linux có giao diện GUI thân thiện nhưng sự mạnh mẽ của nó lại nằm ở các command, trong đó có find.Hãy cùng tìm hiểu xem chúng ta có thể làm những gì với command này nhé. Ctrl + Alt + T để mở terminal nào.

Tìm theo tên

Sử dụng tên file để tìm

Đây có lẽ là cách sử dụng cơ bản nhất và tìm chính xác theo tên bạn đưa vào. Giả sử bạn có một loạt các với tên Test.sh trong cả thư mục hiện hành và các thư mục con, cháu của nó. bạn sử dụng -name rồi đến tên file trong cặp "" như ví dụ dưới :

#find -name "Test.sh"
/home/Test.sh
/home/yourname/Test.sh

Sử dụng tên nhưng sẽ không phân biệt hoa thường

Giống với trên nhưng khác ở chỗ bạn chỉ cần thêm i (tức là ignore) vào là bạn có thể tìm theo tên mà không phân biệt hoa thường.

# find -iname "Test.sh"
/home/Test.sh
/home/yourname/Test.sh
/home/yourname/test.sh
/home/yourname/test
/home/yourname/test/TEST.sh

Tip 1 : Như bạn thấy thì find sẽ tìm theo cả tên thư mục nên để hạn chế, bạn hãy chỉ định loại cần tìm là chỉ file mà thôi bằng cách thêm vào -type f. Tìm thư mục sẽ là _-type _ d

Tip 2 : nếu bạn muốn tìm các file và thư mục không có tên là Test.sh thì hãy thêm -not vào trước -name hay -iname để phủ định kết quả.

Tìm theo thư mục

Như ở trên bạn đang tìm all trong máy tính của bạn, nhưng nếu bạn chỉ định thư mục tìm kiếm thì find chỉ tìm trong đó mà thôi. Ngoài ra, nếu bạn không muốn tìm quá sâu bên trong thư mục đó, bạn sẽ dùng đến mindepthmaxdepth. Bạn chỉ tìm trong thư mục /home và trong thư mục con trự tiếp của nó thì sẽ như sau :

# find /home -iname "Test.sh" -maxdepth 1 -type f
/home/Test.sh
/home/yourname/Test.sh
/home/yourname/test.sh

Hơn nữa bạn có thể sử dụng kết hợp với mindepth để tìm trong khoảng level nào đó của thư mục :

# find /home -iname "Test.sh" mindepth 1 -maxdepth 2 -type f
/home/yourname/Test.sh
/home/yourname/test.sh
/home/yourname/test/TEST.sh

Như trên thì /home là điểm bắt đầu, sâu xuống 1 level là để /yourname, tối đa tìm ở level 2 là /test và chúng ta có kết quả như trên.

Thực thi lệnh với các file tìm được

Đôi khi chúng ta muốn kết hợp luôn các command khác với find, để xử lý các kết quả tìm được, như xóa chúng đi, hay copy đến thư mục chỉ định ... lúc đó bạn cần dùng đến -exec (viết tắt của execute). Như bên dưới tôi muốn tính toán mã md5 của các file tìm được :

# find /home -type f -iname "Test.sh" -maxdepth 1 -exec md5sum {} \;
d4dd8cd98f00b204e9800998fjgwjwor /home/Test.sh
r31g8cd98f00b204e98009953j0f27g8 /home/yourname/Test.sh
9k9d8cggkf00b204e980fd9sgs8s69gk /home/yourname/test.sh

Các bạn thấy ở trên tôi dùng {} đây là đối số truyền vào cho md5sum, nó là file hiện tại khi find tìm thấy 1 file nào đó. Còn ; là để kết thúc việc thực thi với file hiện tại đó.

# find /home -type f -iname "Test.sh" -maxdepth 1 -exec rm {} \;

Một ví dụ khác, nếu chạy lệnh trên tức là bạn đã remove hết các file tìm được bởi find.

Tìm file trống ( 0 byte)

Đôi khi có những file trống được tạo ra mặc định, hoặc do nguyên nhân nào đó và bạn muốn kiểm tra xem có những fie dạng như vậy không thì find hoàn toàn hỗ trợ được bạn bằng cách truyền vào -empty:

# find /home -empty

Tip 1 : hãy thêm -exec rm {} ; để loại bỏ những file trống không cần thiết.

Tip 2 : khoan ! bạn có thể xóa mất các file hệ thống empty, đôi khi nó trống nhưng lại có ích để làm gì đó.

# find /home -empty -not -name ".*" -exec rm {} \;

chỗ ".*" ở trên có ý nghĩa là không remove các file bắt đầu bằng ., còn * như các bạn đã biết nó thay thế cho bất kì kí tự nào. Mà các file hệ thống thường là ẩn và bắt đầu bằng .

Tìm file theo dung lượng

Bạn có thể sử dụng dung lượng để tìm kiếm bằng cách truyền vào -size như sau :

# find /home -iname "test.*" -size 10M -type f

Đoạn lệnh trên sẽ tìm kiếm một cách chính xác dung lượng các file bắt đầu bằng test không phân biệt hoa thường và có đuôi bất kì, nhưng chỉ những file nặng 10M.

Tip : Bạn chỉ cần dùng -10M hay +10M để tìm những file nhỏ hơn hoặc lớn hơn 10M -> thêm - hay + trước con số dung lượng file.

Ví dụ như tôi hằng ngày hay zip 1 vài thư mục thành .zip và sau một thời gian chúng không còn cần thiết nữa. Tôi sẽ chạy lệnh sau để remove các file nặng hơn 5M :

# find /home/mydir/zip -name "*.zip" -size +5M -type f -exec rm {} \;

Tìm file theo thời gian

Trước tiên nếu bạn chưa biết thì cần hiểu đối với 1 file nó sẽ có 3 yếu tố thời gian như sau :

  • Thời gian truy cập (access time) : là thời điểm cuối cùng mà file đó được bạn hay ai đó truy cập vào
  • Thời gian chỉnh sửa (modification time) : nếu ai đó truy cập vào file mà có chỉnh sửa nội dung nào đó thì chính là thời gian chỉnh sửa này, nó khác với access time nhé.
  • Thời gian thay đổi : mỗi file sẽ có một inode number riêng của chúng -> đây chính là thời điểm cuối cùng mà inode của 1 file bị thay đổi.

Do chưa rõ lắm inode là gì? nên trong bài này tôi chỉ quan tâm đến 2 cái đầu 😃

Với find command thì bạn có thể chỉ định thời gian đến từng phút (dùng min hoặc theo từng ngày một (dùng time). Ví dụ, tôi thường download file mà không để ý tên file là gì rồi mở file ra ngay, chỉnh sửa rồi sau đó save lại. Và một thời gian cần đến file đó thì rất khó để tìm trong đống file trong thư mục Downloads.

# find /home/myname/Downloads -name *.xlsx -type f -mtime -1

Câu trên nghĩa là tôi tìm kiếm tất cả các file Excel mà đã được chỉnh sửa trong vòng 1 ngày trước.

Tip 1 : để tìm trong vòng bao nhiêu phút thì bạn dùng -mmin

# find /home/myname/Downloads -name *.xlsx -type f -mtime -60

Tip 2 : m ở đây là modification. Nếu bạn muốn tìm the thời gian truy cập thì dùng -atime hoặc -amin

Lưu kết quả tìm được ra file để tổng hợp

Đôi khi tôi muốn lưu các file tìm được vào một file để tổng hợp kết quả mà không in ra màn hình console như bình thường, việc này rất đơn giản :

# find /home/myname/Downloads -name *.xlsx -type f > result.txt

Như trên tôi muốn xem có những file Excel nào đã từng download nên lưu chúng vào result.txt, sau đó tôi có thể loại bớt những file không cần đến nữa chẳng hạn.

Tip : Đôi khi find command không đọc được file nào đó (file ẩn chẳng hạn) hoặc có lỗi nào đó sẽ bắn ra cả nội dung lỗi nên không cần thiết để lưu chúng cùng với kết quả. Bạn chỉ cần thêm _2>/dev/null_như sau :

# find /home/myname/Downloads -name *.xlsx -type f 2>/dev/null > result.txt

Đoạn lệnh trên sẽ catch tất cả các lỗi xảy ra nếu có và đẩy vào /dev/null. Còn kết quả tìm vẫn được lưu vào result.txt

Trên đây là những hữu ích mà find command mang lại cho bạn và tôi nghĩ là nếu dùng Linux thường xuyên thì cũng nên biết để phòng thân 😃 chúng đều là những tình huống theo tôi là khá common trong công việc hàng ngày. Find còn làm được nhiều hơn thế, nên bạn có nhu cầu phức tạp hơn, sâu hơn thì có thể vào đây để đọc, và tất nhiên nó là tiếng Anh nhé 😉

p/s : ở bài sau tôi sẽ giới thiệu bash shell đồng thời ứng dụng find để làm một kịch bản trong thực tế.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí