我了解到将find
与xargs
一起使用时,建议使用带有空格的文件名的-print0
和-0
参数才能正常工作。
现在我有以下名为patterns
的文件,其中包含以下内容
a a a
b b b
我的文件名为text
,内容如下
a
b b b
当我运行以下命令时,
cat patterns| xargs -ipattern grep pattern text
我得到了
b b b
这意味着xargs知道要查找a a a
和b b b
而不是a
,a
,a
,b
,{{ 1}},b
。
我的问题是为什么上面的例子中没有任何问题?我认为它会查找b
,a
,a
,a
,b
,b
并返回b
中的两行}。
我错过了什么?
答案 0 :(得分:1)
-i
和-I
将其从使用(可能引用的)以空格分隔的字符串更改为行。引用man xargs
:
-I replace-str
Replace occurrences of replace-str in the initial-arguments with names read from
standard input. Also, unquoted blanks do not terminate input items; instead the
separator is the newline character. Implies -x and -L 1.
--replace[=replace-str]
-i[replace-str]
This option is a synonym for -Ireplace-str if replace-str is specified, and for
-I{} otherwise. This option is deprecated; use -I instead.
当您在默认情况下使用文件名(即非-I
)模式时,您需要保护空格,制表符,并且(并非像这样的文件名一直是个好主意)新行;因此-0
。