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
find . -name '*.txt' -print -quithiển thị trận đấu đầu tiên và cho phépfindthoá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.