Как мне выполнить find с GNU xargs для обхода набора каталогов?
$ 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 ответа
Используйте GNU Parallel:
parallel -q find {} -name '*.h' ::: {a,b,c}.h d e.h
Посмотрите вступительное видео, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ
Вы пробовали опцию -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
Хм. Тебе нужна труба и ксаргс? Кажется, что все, что нужно вашему примеру, это 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.