(Tôi đang giả sử GNU find
ở đây)
Chỉ sử dụng
find filename
sẽ nhanh chóng, bởi vì nó sẽ trả về filename
hoặc tên bên trong filename
nếu đó là thư mục hoặc lỗi nếu tên đó không tồn tại trong thư mục hiện tại. Đây là một hoạt động rất nhanh, tương tự ls filename
(nhưng đệ quy nếu filename
là một thư mục).
Ngược lại,
find | grep filename
sẽ cho phép find
tạo một danh sách tất cả các tên từ thư mục hiện tại và bên dưới, grep
sau đó sẽ lọc. Đây rõ ràng sẽ là một hoạt động chậm hơn nhiều.
Tôi cho rằng những gì thực sự có ý định là
find . -type f -name 'filename'
Đây sẽ filename
là tên của một tệp thông thường ở bất cứ đâu trong thư mục hiện tại hoặc bên dưới.
Điều này sẽ nhanh chóng (hoặc tương đối nhanh) find | grep filename
, nhưng grep
giải pháp sẽ phù hợp filename
với đường dẫn đầy đủ của mỗi tên được tìm thấy, tương tự như những gì -path '*filename*'
sẽ làm với find
.
Sự nhầm lẫn đến từ một sự hiểu lầm về cách làm find
việc.
Tiện ích này có một số đường dẫn và trả về tất cả các tên bên dưới các đường dẫn này.
Sau đó, bạn có thể hạn chế các tên được trả về bằng các thử nghiệm khác nhau có thể tác động đến tên tệp, đường dẫn, dấu thời gian, kích thước tệp, loại tệp, v.v.
Khi bạn nói
find a b c
bạn hỏi find
để liệt kê tất cả các tên phát hành theo ba con đường a
, b
và c
. Nếu đây là tên của các tệp thông thường trong thư mục hiện tại, thì chúng sẽ được trả về. Nếu bất kỳ tên nào trong số chúng là tên của một thư mục, thì nó sẽ được trả về cùng với tất cả các tên khác trong thư mục đó.
Khi tôi làm
find . -type f -name 'filename'
Điều này tạo ra một danh sách tất cả các tên trong thư mục hiện tại ( .
) và bên dưới. Sau đó, nó hạn chế những cái tên cho những file bình thường, tức là không phải thư mục vv với -type f
. Sau đó, có một hạn chế hơn nữa đối với tên phù hợp filename
bằng cách sử dụng -name 'filename'
. Chuỗi filename
có thể là một mẫu tên tập tin tên, chẳng hạn như *.txt
(chỉ cần nhớ trích dẫn nó!).
Thí dụ:
Sau đây dường như "tìm" tệp được gọi .profile
trong thư mục nhà của tôi:
$ pwd
/home/kk
$ find .profile
.profile
Nhưng trên thực tế, nó chỉ trả về tất cả các tên trong đường dẫn .profile
(chỉ có một tên và đó là của tệp này).
Sau đó, tôi cd
lên một cấp và thử lại:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
Các find
lệnh bây giờ không thể tìm thấy bất kỳ con đường được gọi là .profile
.
Tuy nhiên, nếu tôi làm cho nó nhìn vào thư mục hiện tại, và sau đó giới hạn các tên được trả về chỉ.profile
, nó cũng tìm thấy nó từ đó:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile