findのprint0オプションで出力を減らしましたか?


10

manページやその他のリファレンスを読みましたが、find with -print0optionの動作にはまだ混乱しています。

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

最初のコマンド:

$ 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

2番目のコマンド:

$ 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

2番目のコマンドのファイル名がnull文字で区切られていることがわかりますが、上記の5ではなく3つの出力が表示されるのはなぜですか。


1
技術的には、ヌル区切りではなく、ヌルで終了します。(最後のパス名を含むすべてのパス名の後にNULがあります。)
cjm

回答:


12

あなたの最初の例

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

とは等しくない

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

それは

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

式に以外のアクションが含まれている場合-purge、暗黙の出力は追加されなくなりました。あなたが欲しい

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

ファイル名が3つしか取得されないのは、それらが2番目の条件(アクションがあるもの)に一致するものだからです。入力したものは本当に意味します

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

これにより、片面だけが何を印刷するのかが明確になります。


参考までに、検索式を次のように簡略化できますfind /some/path -iregex '.*intro.*\.jpe?g'。... 式が1つしかないため、cjmで強調表示されている問題を回避できます。
cas

@cjmかっこで1日が節約できました。スクリプトの0日のバグを修正しました!!!
leesei

@mltsyそれは混乱しません、その正規表現;-)。
leesei
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.