我有一个 shell 脚本
find . -name "*.java" -print0 | xargs -0 grep -Lz 'regular_expression'
它以这种方式输出与正则表达式不匹配的文件名:
file1.java
file2.java
...
据我了解,它的工作原理如下:find
找到所需的文件并将它们的名称与\0
. 然后xargs
拆分find
with的输出\0
并将它们grep
一一提供。
然后我想再添加一个阶段并只获取basename
文件。我修改了脚本:
find . -name "*.java" -print0 | xargs -0 grep -LzZ 'regular_expression' | xargs -0 basename
但出现错误。我开始调查并做了一个临时输出:
find . -name "*.java" -print0 | xargs -0 grep -LzZ 'regular_expression' | xargs -0 echo basename
得到了这个:
basename ./file1.java ./file2.java ./subdir/file1.java ./subdir/file2.java
因此,文件名没有被\0
. 我不明白为什么在xargs
使用 withgrep
和不使用xargs
with的情况下将它们分开basename
。
我通过-n1
在后者中使用得到了解决方法xargs
。但是我仍然不明白为什么我需要它(鉴于我没有在xargs
with中使用grep
)以及这个参数的作用。
希望您能向我解释-n1
在后一种用法中我需要它的作用以及为什么我在前一种用法中不需要它grep
。