Заставить 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
, Это намного более гибко, и вы не зависите от поведения оболочки.