(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ề filenamehoặc tên bên trong filenamenế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 filenamelà một thư mục).
Ngược lại,
find | grep filename
sẽ cho phép findtạ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, grepsau đó 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ẽ filenamelà 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 grepgiải pháp sẽ phù hợp filenamevớ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 findviệ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, bvà 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 filenamebằng cách sử dụng -name 'filename'. Chuỗi filenamecó 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 .profiletrong 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 cdlên một cấp và thử lại:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
Các findlệ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