я споткнулся по аналогичной проблеме, и нашел решение, которое, по моему мнению, будет лучше и чище, чем те, которые были представлены до сих пор.
Синтаксис xargs
, что я закончил бы (для примера):
xargs -I X echo --file=X
с полной командной строки бытия:
my-program $(cat input.txt | xargs -I X echo --file=X)
, который будет работать, как если бы
my-program --file=a.txt --file=b.txt --file=c.txt
осуществлен (предоставление input.txt
содержит данные из вашего примера).
На самом деле в моем случае мне нужно сначала найти файлы, а также нуждались в них отсортированы так, моя командная строка выглядит следующим образом:
my-program $(find base/path -name "some*pattern" -print0 | sort -z | xargs -0 -I X echo --files=X)
Немного деталей, которые не могут быть ясными (они не были для меня):
some*pattern
должен быть указан, так как в противном случае должны были бы расширить его, прежде чем перейти к find
.
-print0
, затем -z
и, наконец, -0
использовать нуль-разделение, чтобы обеспечить правильную обработку файлов с пробелами или другими проводными именами.
Обратите внимание, что я еще не испытал это глубоко. Хотя это работает.
Интересно - не знал о GNU Parallel. Баш - разумная оболочка; вам не нужно класть обратную косую черту после трубы, чтобы сообщить ей, что остальная часть команды находится на следующей строке. –
GNU параллель отличная. Одно предупреждение: в некоторых системах вам нужно дать параллельный вариант «-gnu», чтобы заставить его работать разумно. Я больше не использую xargs. Если вы действительно не хотите распараллеливать, вы всегда можете указать параметр «-j 1» (1 задание). – travc
Утилита 'parallel' не всегда доступна, особенно в обычном unix и должна быть установлена, если это возможно. Там есть интересное решение [ниже] (http://stackoverflow.com/a/25623391/2969544), доступное с помощью стандартных инструментов unix. – oklas