bash - 使 xargs 在 Cygwin 中工作

标签 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 中正常工作)

最佳答案

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

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

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

一些事情:

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

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

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

$ find . -type f | xargs foo

在这种情况下,xargs 只会执行foo 最少的次数。 foo 只会在命令行缓冲区已满或没有更多文件名时执行。但是,如果您在每个名称后强制执行,您可能最好使用 find。它更加灵活,并且您不依赖于 shell 行为。

关于bash - 使 xargs 在 Cygwin 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25562978/

相关文章:

linux - 远程命令替换失败

shell脚本语法错误: Unexpected End of File

html - 如何使用 mailx 发送附件和 html 正文

windows - 如何使用/安装 GNU binutils (objdump)

python - 查找 CSV 行的最有效方法是什么,该行不包含该行字段中的重复条目(不包括空白条目)?

linux - 如何使用 bash 脚本检查 "{"是否在 java 文件的单独行中开始

linux - bash 语法错误 : Unaccepted Token Elif

git - 如何强制用户在 GIT 中使用小写的电子邮件地址

plugins - 在cygwin中安装gtk

gcc - Cygwin gcc 正在为我的符号添加一个下划线 "_"前缀。在哪里可以找到有关此行为的文档?