Có đầu ra ít hơn với tùy chọn print0 trên find?


10

Tôi đã đọc trang man và các tài liệu tham khảo khác, nhưng tôi vẫn bối rối bởi hành vi tìm kiếm với -print0tùy chọn.

-print0      This primary always evaluates to true.  It prints the pathname of
             the current file to standard output, followed by an ASCII NUL
             character (character code 0).

Lệnh đầu tiên:

$ find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" 2> /dev/null
/some/path//asdf199Intro-5kqlw.jpeg
/some/path/199intro-2jjaj.JPEG
/some/path/199intro-3.jpg
/some/path/wuer199intro-4.JPG
/some/path/xbzf199INTRO-1.jpg

Lệnh thứ hai:

$ find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" 2> /dev/null -print0
/some/path/136intro-3.jpg/some/path/wuer136intro-4.JPG/some/path/xbzf136INTRO-1.jpg

Tôi có thể thấy rằng tên tệp từ lệnh thứ hai được tách biệt ký tự, nhưng tại sao tôi nhận được 3 đầu ra trái ngược với 5 ở trên?


1
Về mặt kỹ thuật, chúng bị hủy kết thúc , không tách biệt. (Có một NUL sau mỗi tên đường dẫn, bao gồm cả tên cuối cùng.)
cjm

Câu trả lời:


11

Ví dụ đầu tiên của bạn

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg"

không tương đương với

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" -print

Nó tương đương với

 find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print

Khi biểu thức của bạn chứa bất kỳ hành động nào khác -purge, bản in ngầm không còn được thêm vào. Bạn muốn

find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print0 2> /dev/null

Lý do bạn chỉ nhận được 3 tên tệp là vì đó là những tên phù hợp với điều kiện thứ hai của bạn (cái có hành động). Những gì bạn gõ thực sự có nghĩa là

find /some/path/ \( -iname "*intro*jpeg" \) -o \( -iname "*intro*jpg" -print0 \)

Mà hy vọng làm cho nó rõ ràng tại sao chỉ có 1 mặt in bất cứ điều gì.


FYI bạn có thể đơn giản hóa biểu thức tìm kiếm bằng: find /some/path -iregex '.*intro.*\.jpe?g'... và vì hiện tại chỉ có một biểu thức nên sẽ tránh được vấn đề được tô sáng bởi cjm.
cas

@cjm các dấu ngoặc đơn đã lưu trong ngày của tôi, tôi đã sửa lỗi 0 ngày trong tập lệnh của mình !!!
leesei

@mltsy không khó hiểu, biểu thức chính quy của nó ;-).
leesei
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.