$ echo {a,b,c}.h d e.h |xargs -IA find A -name '*.h'
find: `a.h b.h c.h d e.h': No such file or directory
$ echo -e a.h\\nb.h c.h d e.h |xargs -IA find A -name '*.h'
a.h
find: `b.h c.h d e.h': No such file or directory
Проблема - это -I
подразумевает, что xargs предположит, что аргументы разграничены новой строкой. Я не уверен, почему это. Я считаю, что могу решить эту проблему с sed, но интересно, существует ли прием xargs или идиома, я не знаком с тем, люди используют для решения этого.
Я ищу решение, которое будет также работать над OS X. На OS X xargs-J переключатель, кажется, хорошо работает. Страница справочника утверждает, что этот переключатель будет просто управлять, куда аргументы помещаются для исполняемого файла - который является точно, что я хочу.
Хм. Вам нужны канал и xargs? Кажется, что для всего Вашего примера действительно нужно, find
и echo
.
Я предполагаю, что это - часть большей загадки, таким образом, это не может работать в контексте того, что Вы делаете, но Ваш пример мог быть записан как:
$ find `echo {a,b,c}.h d e.h` -name '*.h'
$ find $(echo {a,b,c}.h d e.h) -name '*.h'
... который, в моей системе, результатах в find
проверка каждого аргумента индивидуально:
find: `a.h': No such file or directory
find: `b.h': No such file or directory
find: `c.h': No such file or directory
find: `d': No such file or directory
find: `e.h': No such file or directory
У меня нет машины OSX для тестирования с, и они могут быть определенными для удара.
Почему не просто find {a,b,c}.h d e.h -name '*.h'
?
Вы пробовали-d опцию к xargs?
justin@eee:~$ echo {a,b,c}.h d e.h |xargs -d ' ' -n1 -IA echo foo A
foo a.h
foo b.h
foo c.h
foo d
foo e.h
или еще более простой,
justin@eee:~$ for x in $(echo {a,b,c}.h d e.h);do echo foo $x;done
foo a.h
foo b.h
foo c.h
foo d
foo e.h
Использование параллель GNU:
parallel -q find {} -name '*.h' ::: {a,b,c}.h d e.h
Посмотрите вводное видео для узнавания больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ