让xargs在Cygwin中运行

时间:2014-08-29 06:47:03

标签: bash shell cygwin xargs

Linux / bash,获取输入行列表并使用xargs处理每一行:

% ls -1 --color=never | xargs -I{} echo {}
a
b
c

Cygwin,取1:

$ ls -1 --color=never | xargs -I{} echo {}
    xargs: invalid option -- I
    Usage: xargs [-0prtx] [-e[eof-str]] [-i[replace-str]] [-l[max-lines]]
           [-n max-args] [-s max-chars] [-P max-procs] [--null] [--eof[=eof-str]]
           [--replace[=replace-str]] [--max-lines[=max-lines]] [--interactive]
           [--max-chars=max-chars] [--verbose] [--exit] [--max-procs=max-procs]
           [--max-args=max-args] [--no-run-if-empty] [--version] [--help]
           [command [initial-arguments]]

Cygwin,取2:

$ ls -1 --color=never | xargs echo
a b c

(是的,我知道有ls -1 --color=never | while read X; do echo ${X}; done的通用方法,我已经测试过它在Cygwin中也有效,但我正在寻找一种让xargs在Cygwin中正常工作的方法)< / p>

2 个答案:

答案 0 :(得分:2)

damienfrancois's回答是正确的。您可能希望使用-n强制echo一次回显一个文件名。

但是,如果您真的对采用每个文件并一次执行一个文件感兴趣,那么最好使用find

$ find . -maxdepth 1 --exec echo {} \;

一些事情:

  • 这将选取以句点开头的文件名(包括“。”)
  • 这会在您的文件名前添加./
  • 使用的echo来自/bin/echo,而不是内置的echo版本。

但是,它不依赖于执行ls *的shell和可能导致问题的可能性(例如着色文件名,或打印出子目录中的文件(您的命令将执行此操作)。

xargs的目的是最小化特定命令的执行:

$ find . -type f | xargs foo

在这种情况下,xargs只执行foo次数最少。 foo仅在命令行缓冲区已满或者没有其他文件名时执行。但是,如果您在每个名称后强制执行,那么最好使用find。它更灵活,你不依赖shell行为。

答案 1 :(得分:1)

使用-n的{​​{1}}参数,这是您应该使用的参数,因为xargs是一个用于为参数提供&#39; name&#的选项39;所以你可以让它们出现在命令行的任何地方:

-I

从联系手册:

$ ls -1 --color=never | xargs echo
a b c
$ ls -1 --color=never | xargs  -n 1 echo
a
b
c