Cách dùng lệnh Find Tìm file và thư mục trên Linux

Bất kể mình quyết tâm sắp xếp dữ liệu như thế nào, nhưng mỗi lần tìm file thì lại không thấy đâu cả. Đôi khi là do mình không thể nhớ tên file. Nhưng nhớ tên file rồi mà không nhớ nơi lưu thì cũng vậy. Tuy nhiên, trong bài viết này, mình sẽ hướng dẫn các bạn tìm file hoặc thư mục trên Linux bằng lệnh find nhé.

Tìm file và thư mục trên Linux bằng lệnh find

Cài đặt lệnh find

Lệnh find được xác định bởi POSIX, nó tạo ra tiêu chuẩn mở mà theo đó các hệ thống POSIX (bao gồm Linux, BSD và macOS) sẽ được tương thích. Nói một cách đơn giản, bạn sẽ cài đặt được lệnh này miễn là bạn đang chạy Linux, BSD hoặc macOS.

Tuy nhiên, không phải tất cả các lệnh find đều hoàn toàn giống nhau. Ví dụ: lệnh find GNU có các tính năng mà lệnh BSD hoặc Busybox hoặc Solaris find có thể không có hoặc có nhưng hoạt động theo cách khác. Bài viết này sử dụng GNU find từ gói findutils vì nó có sẵn và khá phổ biến. Hầu hết các lệnh được trình bày trong bài viết này đều hoạt động với các cách triển khai khác của find, nhưng nếu bạn thử lệnh find trên nền tảng không phải Linux và nhận được kết quả không mong muốn, hãy thử tải xuống và cài đặt phiên bản GNU.

Tìm file theo tên

Bạn có thể tìm file theo tên bằng cách cung cấp tên tệp đầy đủ hoặc các phần của tên tệp bằng cách sử dụng regular expressions. Lệnh find yêu cầu đường dẫn đến thư mục bạn muốn tìm kiếm, ngoài ra còn có các tùy chọn khác như -name cho tên tệp phân biệt chữ hoa chữ thường và sau đó là chuỗi tìm kiếm. Theo mặc định, lệnh find tìm kiếm tên tệp chính xác là chuỗi bạn nhập giữa dấu nháy kép trừ khi bạn sử dụng cú pháp egular expression.

Giả sử thư mục Documents của bạn chứa bốn tệp: Foo, foo, foobar.txt và foo.xml. Đây là cách tìm tệp có tên “foo”:

$ find ~ -name "foo"
/home/tux/Documents/examples/foo

Bạn có thể mở rộng tìm kiếm của mình bằng cách phân biệt chữ hoa chữ thường với tùy chọn -iname:

$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

Tìm file theo ký tự đại diện

Bạn có thể sử dụng các ký tự đại diện shell cơ bản để mở rộng tìm kiếm của mình. Ví dụ: dấu hoa thị (*) đại diện cho bất kỳ số hoặc ký tự nào:

$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

Dấu chấm hỏi (?) đại diện cho một ký tự:

$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

Đây không phải là cú pháp của regular expression, vì vậy dấu chấm (.) đại diện cho một dấu chấm theo nghĩa đen.

Tìm file bằng Regular expressions

Bạn cũng có thể sử dụng regular expression. Như với -iname và -name, là tùy chọn phân biệt chữ hoa chữ thường và không phân biệt chữ hoa chữ thường. Tuy nhiên, không giống như các tùy chọn -name và -iname, tùy chọn -regex và -iregex được áp dụng cho toàn bộ đường dẫn, không chỉ tên tệp. Điều đó có nghĩa là nếu bạn tìm kiếm foo, bạn sẽ không nhận được kết quả nào vì foo không khớp với /home/tux/Documents/foo. Thay vào đó, bạn phải tìm kiếm toàn bộ đường dẫn hoặc sử dụng ký tự đại diện:

$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

Tìm file đã được sửa đổi trong tuần trước

Để tìm file bạn đã sửa đổi lần cuối vào tuần trước, hãy sử dụng tùy chọn -mtime cùng với số ngày (âm) trong quá khứ:

$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

Tìm file đã được sửa đổi trong vòng vài ngày

Bạn có thể kết hợp các tùy chọn -mtime để tìm tệp trong một phạm vi ngày. Đối với tùy chọn -mtime đầu tiên, hãy cung cấp số ngày gần đây nhất mà bạn có thể đã sửa đổi tệp và đối với tùy chọn thứ hai, cung cấp số ngày lớn nhất. Ví dụ: lệnh dưới tìm kiếm các tệp có số lần sửa đổi nhiều hơn một ngày trong quá khứ, nhưng không quá bảy:

$ find ~ -mtime +1 -mtime -7

Giới hạn tìm kiếm theo loại tệp

Bạn có thể tối ưu hóa kết quả tìm kiếm bằng cách chỉ định loại tệp bạn đang tìm kiếm. Bạn không nên sử dụng tùy chọn này nếu bạn không chắc mình đang tìm gì, nhưng nếu bạn biết mình đang tìm kiếm một tệp chứ không phải một thư mục hoặc một thư mục nhưng không phải một tệp, thì đây có thể là một lựa chọn tuyệt vời. Tùy chọn là -type và các đối số của nó là ký tự đại diện cho một vài loại dữ liệu khác nhau. Phổ biến nhất là:

  • d – thư mục
  • f – file
  • l – liên kết tượng trưng
  • s – socket
  • p – named pipe (used for FIFO)
  • b – khối đặc biệt (thường là ký hiệu ổ cứng)

Dưới đây là một số ví dụ:

$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1

Điều chỉnh phạm vi

Lệnh find là lệnh đệ quy theo mặc định, có nghĩa là nó tìm kiếm kết quả trong các thư mục con. Điều này có thể mất thời gian cho một hệ thống tệp lớn, nhưng bạn có thể sử dụng tùy chọn -maxdepth để kiểm soát mức độ sâu của đệ quy.

$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15

Bạn có thể luân phiên đặt độ sâu đệ quy tối thiểu với -mindepth:

$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255

Ngoài ra, bạn cũng có thể xem thêm 10 lệnh Linux nguy hiểm tuyệt đối không nên thử tại đây.

Previous Post Next Post