Chỉ tìm thấy vài tập tin phù hợp đầu tiên bằng cách sử dụng find?


17

Nói rằng có thể có hàng trăm *.txttập tin trong một thư mục. Tôi chỉ muốn tìm ba *.txttập tin đầu tiên và sau đó thoát khỏi quá trình tìm kiếm.

Làm thế nào để đạt được điều này bằng cách sử dụng findtiện ích? Tôi đã nhanh chóng thông qua trang người đàn ông của nó, dường như không phải là một lựa chọn cho việc này.


3
Bạn chỉ có thể sử dụng find . -name '*.txt' -print -quithiển thị trận đấu đầu tiên và cho phép findthoát sau trận đấu đầu tiên. Tôi không biết liệu có thể thích ứng với trường hợp "thoát sau khi tìm thấy n khớp" hay không.
NN

Câu trả lời:


22

Bạn có thể dẫn đầu ra của findthông qua head:

find . -name '*.txt' | head -n 3

2
Tôi biết điều này, tôi muốn thoát khỏi quá trình tìm kiếm sau khi tìm ra ba tệp phù hợp đầu tiên. Có thể có một lượng lớn các tệp phù hợp mà tôi không quan tâm.
mitnk

2
Tôi nghĩ rằng lệnh find sẽ bị chấm dứt khi head đã in 3 tệp đầu tiên
Thẻ Chris

1
Vâng, nó lạ, nhưng bạn đã đúng.
mitnk

19
Không có gì lạ cả - đó là cách các đường ống hoạt động trong UNIX. headkhởi động và chờ đầu vào từ phía bên trái của đường ống. Sau đó findkhởi động và tìm kiếm các tệp phù hợp với tiêu chí được chỉ định, gửi đầu ra của nó qua đường ống. Khi headđã nhận và in số lượng dòng yêu cầu, nó chấm dứt, đóng đường ống. findthông báo đường ống kín và nó cũng chấm dứt. Đơn giản, thanh lịch và hiệu quả.
D_Bye

3
Tóm lại, -n 3tương thích POSIX , và do đó có khả năng dễ mang theo hơn.
l0b0

4

Câu trả lời khác này có phần thiếu sót. Lệnh là

find . -name '*.txt' | head -n 3

Sau đó, có một lời giải thích trong một trong những ý kiến [nhấn mạnh của tôi]:

headkhởi động và chờ đầu vào từ phía bên trái của đường ống. Sau đó findkhởi động và tìm kiếm các tệp phù hợp với tiêu chí được chỉ định, gửi đầu ra của nó qua đường ống. Khi headđã nhận và in số lượng dòng yêu cầu, nó chấm dứt, đóng đường ống. findthông báo đường ống kín và nó cũng chấm dứt. Đơn giản, thanh lịch và hiệu quả .

Điều này gần như đúng.

Vấn đề là findthông báo đường ống kín chỉ khi nó cố gắng ghi vào nó - trong trường hợp này là khi trận đấu thứ 4 được tìm thấy. Nhưng nếu không có trận đấu thứ 4 thì findsẽ tiếp tục. Vỏ của bạn sẽ chờ! Nếu nó xảy ra trong một tập lệnh, tập lệnh sẽ chờ, mặc dù thực tế chúng ta đã biết đầu ra ống là cuối cùng và không có gì có thể được thêm vào nó. Không hiệu quả lắm.

Hiệu ứng này không đáng kể nếu việc này đặc biệt findkết thúc nhanh nhưng với tìm kiếm phức tạp trong cây tệp lớn, lệnh có thể trì hoãn một cách không cần thiết bất cứ điều gì bạn muốn làm tiếp theo.

Giải pháp không hoàn hảo là chạy

( find … & ) | head -n 3

Cách này khi headthoát ra, vỏ tiếp tục ngay lập tức. findQuá trình nền có thể bị bỏ qua sau đó (nó sẽ thoát sớm hay muộn) hoặc được nhắm mục tiêu với pkillhoặc một cái gì đó.


Để chứng minh khái niệm bạn có thể tìm kiếm /. Chúng tôi chỉ mong đợi một trận đấu, nhưng findtìm kiếm nó ở khắp mọi nơi và nó có thể mất rất nhiều thời gian.

find / -wholename / 2>/dev/null | head -n 1

Chấm dứt nó với Ctrl+ Cngay khi bạn thấy vấn đề. Bây giờ so sánh:

pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.