$ 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, кажется, работает нормально. На man-странице утверждается, что этот переключатель будет просто контролировать расположение аргументов для исполняемого файла - именно это я и хочу.

4 ответа4

0

Хм. Тебе нужна труба и ксаргс? Кажется, что все, что нужно вашему примеру, это 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 для тестирования, и это может быть связано с Bash.

0

Используйте GNU Parallel:

parallel -q find {} -name '*.h' ::: {a,b,c}.h d e.h

Посмотрите вступительное видео, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

0

Почему бы просто не find {a,b,c}.h d e.h -name '*.h'?

0

вы пробовали опцию -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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .