我已经阅读了手册页和其他参考资料,但我仍然对 find 和-print0
option的行为感到困惑。
-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).
Run Code Online (Sandbox Code Playgroud)
第一条命令:
$ 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
Run Code Online (Sandbox Code Playgroud)
第二个命令:
$ 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
Run Code Online (Sandbox Code Playgroud)
我可以看到第二个命令中的文件名是空字符分隔的,但是为什么我得到 3 个输出而不是上面的 5 个?
cjm*_*cjm 13
你的第一个例子
find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg"
Run Code Online (Sandbox Code Playgroud)
不等于
find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" -print
Run Code Online (Sandbox Code Playgroud)
它相当于
find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print
Run Code Online (Sandbox Code Playgroud)
当您的表达式包含除 之外的任何操作时-purge
,不再添加隐式打印。你要
find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print0 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
您只获得 3 个文件名的原因是那些与您的第二个条件(具有操作的条件)匹配的文件名。你输入的真正含义
find /some/path/ \( -iname "*intro*jpeg" \) -o \( -iname "*intro*jpg" -print0 \)
Run Code Online (Sandbox Code Playgroud)
这有希望说明为什么只有 1 面打印任何东西。