Masz mniej wyników dzięki opcji print0 przy szukaniu?

10

Przeczytałem stronę podręcznika man i inne odnośniki, ale nadal jestem zdezorientowany zachowaniem find z -print0opcją.

-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).

Pierwsze polecenie:

$ 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

Drugie polecenie:

$ 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

Widzę, że nazwy plików z drugiego polecenia są rozdzielone znakami zerowymi, ale dlaczego otrzymuję 3 dane wyjściowe w przeciwieństwie do 5 powyżej?

Myśliciel
źródło
1
Technicznie są one zakończone zerem , a nie rozdzielone zerem. (Po każdej nazwie ścieżki, w tym ostatniej, znajduje się NUL).
cjm

Odpowiedzi:

12

Twój pierwszy przykład

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

nie jest równoważne z

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

Jest to równoważne z

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

Gdy wyrażenie zawiera jakiekolwiek działanie inne niż -purge, niejawne drukowanie nie jest już dodawane. Chcesz

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

Powodem, dla którego otrzymujesz tylko 3 nazwy plików, jest to, że są to te, które pasują do twojego drugiego warunku (tego, który ma akcję). Co naprawdę wpisałeś?

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

Co, mam nadzieję, wyjaśnia, dlaczego tylko jedna strona drukuje cokolwiek.

cjm
źródło
Dla twojej informacji możesz uprościć wyszukiwanie wyrażeń za pomocą: find /some/path -iregex '.*intro.*\.jpe?g'... a ponieważ jest teraz tylko jedno wyrażenie, pozwoli to uniknąć problemu podkreślonego przez cjm.
cas
@cjm nawiasy uratowały mi dzień, naprawiłem 0-dniowy błąd w moim skrypcie !!!
leesei
@mltsy nie jest mylące, jego wyrażenie regularne ;-).
leesei