Заставить xargs работать в Cygwin

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)

2 ответа

Решение

Использовать -n аргумент xargs, который на самом деле тот, который вы должны использовать, как -I это опция, которая служит для присвоения аргументу имени, чтобы вы могли отображать их в любом месте командной строки:

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

Из справочной страницы:

   -n max-args
          Use at most max-args arguments per command line

   -I replace-str
          Replace occurrences of replace-str in the initial-arguments with names read from standard input.

Дамиенфрансуа ответ правильный. Вы, вероятно, хотите использовать -n укреплять echo отображать одно имя файла за раз.

Тем не менее, если вы действительно заинтересованы в том, чтобы брать каждый файл и выполнять его по одному, лучше воспользоваться find:

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

Несколько вещей:

  • Это подберет имена файлов, начинающиеся с точки (включая ".")
  • Это положит ./ перед вашими именами файлов.
  • echo используется из /bin/echo а не встроенная в оболочку версия echo.

Тем не менее, это не зависит от выполнения оболочки ls * и возможность возникновения проблем (таких как окраска имен файлов или распечатка файлов в подкаталогах (что сделает ваша команда).

Цель xargs было минимизировать выполнение конкретной команды:

$ find . -type f | xargs foo

В этом случае, xargs выполнит foo только минимальное количество раз. foo будет выполняться только тогда, когда буфер командной строки заполнится или файлов больше не будет. Однако, если вы заставляете выполнение после каждого имени, вам, вероятно, лучше использовать find, Это намного более гибко, и вы не зависите от поведения оболочки.

Другие вопросы по тегам