Punya sedikit keluaran dengan opsi print0 on find?

10

Saya telah membaca halaman manual dan referensi lain, tetapi saya masih bingung dengan perilaku menemukan -print0opsi.

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

Perintah pertama:

$ 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

Perintah kedua:

$ 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

Saya dapat melihat bahwa nama file dari perintah kedua dipisahkan dengan karakter null, tetapi mengapa saya mendapatkan 3 output sebagai lawan dari 5 di atas?

Forethinker
sumber
1
Secara teknis, mereka diakhiri nol , tidak dipisahkan nol. (Ada NUL setelah setiap pathname, termasuk yang terakhir.)
cjm

Jawaban:

12

Contoh pertama Anda

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

tidak setara dengan

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

Ini setara dengan

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

Saat ekspresi Anda mengandung tindakan apa pun selain -purge, cetakan implisit tidak lagi ditambahkan. Kamu ingin

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

Alasan Anda hanya mendapatkan 3 nama file adalah itu adalah yang cocok dengan kondisi kedua Anda (yang memiliki tindakan). Apa yang Anda ketik benar-benar berarti

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

Yang mudah-mudahan memperjelas mengapa hanya 1 sisi yang mencetak apa saja.

cjm
sumber
FYI Anda dapat menyederhanakan ekspresi find dengan: find /some/path -iregex '.*intro.*\.jpe?g'... dan karena sekarang hanya ada satu ekspresi yang akan menghindari masalah yang disorot oleh cjm.
cas
@ cjm kurung menyelamatkan hari saya, saya memperbaiki bug 0-hari di skrip saya !!!
leesei
@mltsy itu tidak membingungkan, ekspresi regulernya ;-).
leesei