Я наткнулся на похожую проблему и нашел решение, которое, мне кажется, более приятное и чистое, чем те, что были представлены до сих пор.
Синтаксис для 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
должно быть заключено в кавычки, так как в противном случае shell расширит его до перехода к find
.
-print0
, затем -z
и, наконец, -0
используют нулевое разделение для обеспечения правильной обработки файлов с пробелами или другими проводными именами.
Обратите внимание, что я еще не проверил это глубоко. Хотя, похоже, работает.