据我理解,以下内容的意思应该完全相同:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
如果没有指定 -I 选项,则默认为 -I{}。
我想列出当前目录中的所有文件并对file
每个文件运行命令。有些文件的名称中有空格。但是,我注意到了区别。见下文:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
明确指定 -I{} 后,文件名中的空格将按预期处理。
答案1
需要-I
定义的占位符。-i
选项将假定{}
是占位符。这是我在man xargs
Cygwin 和 CentOS 中至少发现任何 {} 假设的地方。
不使用任何选项调用的 xargs 不需要占位符,它只是将 STDIN 附加到参数的末尾。
只需添加echo
到您的示例中即可查看 xargs 正在执行的操作:
$ ls -1
Hello World/
您的示例错误地使用了{}
:
$ ls -1 | xargs echo file {}
file {} Hello World/
因此file
cmd 会看到参数{} Hello World
和错误。
如果您想{}
在 xargs 调用中明确使用:
$ ls -1 | xargs -I{} echo file {}
file Hello World/
或者没有占位符:
$ ls -1 | xargs echo file
file Hello World/
上面调用的 xargs 不需要 {}。它将 STDIN 附加到命令末尾,没有占位符。使用 {} 通常意味着您希望 STDIN 在 cmd 中间的某个位置执行,如下所示:
$ ls -1 | xargs -i mv {} /path/to/someplace/.