tìm thất bại khi không tìm thấy gì


8

Khi findđược gọi để không tìm thấy gì, nó vẫn thoát với mã 0. Có cách nào để làm cho nó trả về mã thoát chỉ ra lỗi khi không tìm thấy tệp không?


1
Tôi không nghĩ findtrực tiếp hỗ trợ nó. Bạn có thể làm một cái gì đó như find ... -print0 | grep -qz ., có lẽ, nếu bạn grephỗ trợ nó.
muru

Grep của tôi là gnu grep vì vậy nó hỗ trợ ý tưởng hay này. Thật không may, tôi cũng cần đầu ra tìm được đặt ở đâu đó và tôi không thể thay thế đường ống bằng -exec.
XZS

Tôi đang làm một cái gì đó.
PNDA

1
@XZS bạn có thể bỏ qua -q, sau đó grepsẽ đơn giản chuyển qua dữ liệu, trong khi vẫn phá vỡ đường ống dẫn và báo cáo lỗi nếu không có gì đi qua.
muru

@muru Một grep không làm gì bảo vệ đường ống, rất thanh lịch. Biến điều này thành một câu trả lời và nó sẽ được chấp nhận.
XZS

Câu trả lời:


7

Nếu bạn grephỗ trợ đọc các dòng được phân cách bằng NUL (như GNU grepvới -z), bạn có thể sử dụng nó để kiểm tra xem có bất cứ thứ gì được xuất ra bởi find:

find /some/path -print0 | grep -qz .

Để chuyển dữ liệu sang lệnh khác, bạn có thể xóa -qtùy chọn, cho phép greptruyền dữ liệu không bị thay đổi trong khi vẫn báo cáo lỗi nếu không có gì xảy ra:

find /some/path -print0 | grep -z . | ...

Cụ thể, ${PIPESTATUS[1]}trong bash nên giữ trạng thái thoát của grep.

Nếu bạn findkhông hỗ trợ -print0, việc sử dụng grep mà không có -zvà hy vọng rằng các dòng mới trong tên tệp sẽ không gây ra sự cố:

find ... | grep '^' | ...

Trong trường hợp này, sử dụng ^thay vì .có thể an toàn hơn. Nếu đầu ra có các dòng mới liên tiếp, ^sẽ vượt qua chúng, nhưng .sẽ không.


Grep's -zlà một phần mở rộng GNU. Bạn có cái gì cho Posixy hơn không?

@jww không có khả năng, vì với POSIX thuần túy, tôi không nghĩ bạn có thể phát hiện ra lỗi ở giữa ống vỏ. Nếu bạn có một shell có thể làm điều đó (thông qua PIPE_STATUShoặc một cái gì đó tương tự), thì nó có thể có một shell có thể thực hiện readđầu vào được phân tách bằng null; sau đó bạn có thể đọc một dòng duy nhất, thất bại nếu trống; hoặc in nó ra và catphần còn lại. (Giả sử bạn muốn truyền dữ liệu cho người khác, nếu không bạn có thể làm được find ... -exec echo foo {} \+ | grep -q foo.)
muru

2

Bạn hỏi cụ thể về mã trả lại ... mà tôi không thấy trong các tùy chọn. Nhưng đây là cách tôi giải quyết nó (vì grep -zkhông có trên cổng Mac):

Cung cấp mã 0 nếu tìm thấy 1 dòng

test 1 == `find */.kitchen/ -name private_key | wc -l`

Vì thế...

if [ 0 == `find */.kitchen/ -name my-file.txt | wc -l` ] ; then
   echo "Nothing found"; exit;
fi

Ngoài ra, như một giải pháp chung, điều này có thể hữu ích:

Kiểm tra xem đường ống có trống không và chạy lệnh trên dữ liệu nếu nó không

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.