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. ...
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.
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ả.
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 mindepth và maxdepth. 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.
Đô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.
Đô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 .
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 {} ;
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