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]:
head
khởi động và chờ đầu vào từ phía bên trái của đường ống. Sau đó find
khở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. find
thô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à find
thô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ì find
sẽ 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 find
kế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 head
thoát ra, vỏ tiếp tục ngay lập tức. find
Quá 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 pkill
hoặ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 find
tì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
find . -name '*.txt' -print -quit
hiển thị trận đấu đầu tiên và cho phépfind
thoá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.