Przeczytałem stronę podręcznika man i inne odnośniki, ale nadal jestem zdezorientowany zachowaniem find z -print0
opcją.
-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?
Odpowiedzi:
Twój pierwszy przykład
nie jest równoważne z
Jest to równoważne z
Gdy wyrażenie zawiera jakiekolwiek działanie inne niż
-purge
, niejawne drukowanie nie jest już dodawane. ChceszPowodem, 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ś?
Co, mam nadzieję, wyjaśnia, dlaczego tylko jedna strona drukuje cokolwiek.
źródło
find /some/path -iregex '.*intro.*\.jpe?g'
... a ponieważ jest teraz tylko jedno wyrażenie, pozwoli to uniknąć problemu podkreślonego przez cjm.