xargs -I % command -option1 % -option2 % под cygwin

Из ответов на этот вопрос я узнал: Заставить xargs работать в Cygwin эту опцию xargs -I не работает должным образом под Cygwin. Были некоторые обходные пути, но, к сожалению, в моем случае это не помогает.

Мой вопрос в том, как я могу приблизиться к тому же результату, что и:

..somthing that produces multiple lines.. | xargs -I % command -option1 % -option2 %

в среде Cygwin?

Изменить:

Чтобы уточнить, я хотел бы получить некоторые значения из стандартного ввода и вызвать «команду», поместив их в два места в качестве аргументов «%». Я хотел бы несколько раз вызывать свою команду для данных, созданных «чем-то».

Пример 1: (я давно не программировал на cpp, так что простите меня за ошибки)

find -name *.cpp | cut -d. -f1 | xargs -I % gcc -o %.o -I %.h %.cpp

Пример 2:

cat songs_to_process.txt | xargs -I % convert --format=mp3 --source=%.avi --output=%.mp3

person mpasko256    schedule 17.12.2017    source источник
comment
Ваш вопрос не ясен. Что должно произойти с каждой строкой вывода?   -  person choroba    schedule 17.12.2017
comment
@choroba Я отредактировал свой вопрос, спасибо за уведомление.   -  person mpasko256    schedule 17.12.2017
comment
Какая у вас версия cygwin? Какую ошибку вы получаете?   -  person choroba    schedule 17.12.2017
comment
uname -r возвращает 2.6.0 (0.304/5/3), может быть, мне обновить до 2.9...   -  person mpasko256    schedule 17.12.2017
comment
Сообщение об ошибке: xargs: недопустимая опция -- I   -  person mpasko256    schedule 17.12.2017
comment
Ваш xargs действительно от Cygwin? xargs --version дает вам что-нибудь полезное? Показывает ли type xargs, что он исходит из того же каталога, где, скажем, type find говорит, что находится двоичный файл find?   -  person Charles Duffy    schedule 17.12.2017
comment
xargs -I является обязательным для POSIX-совместимой реализации, так что это не похоже на у другого/старого Cygwin xargs этого не было бы.   -  person Charles Duffy    schedule 17.12.2017
comment
@CharlesDuffy xargs --version читает: Упаковано Cygwin (4.6.0-1) type xargs и which xargs дает: (/usr/bin/xargs)   -  person mpasko256    schedule 17.12.2017
comment
Это... удивительно, если честно. Я захочу воспроизвести в какой-то момент, когда у меня будет под рукой машина с Windows.   -  person Charles Duffy    schedule 17.12.2017


Ответы (1)


Вам вообще не нужно xargs для этой работы — ни в ни в одном из ваших примеров.

find . -name '*.cpp' -print0 | while IFS= read -r -d '' filename; do
  basename=${filename%.*}
  gcc -o "${basename}.o" -I "${basename}.h" "${basename}.cpp"
done

...or:

while IFS= read -r song; do
    song=${song%$'\r'} # repair if your input file is in DOS (CRLF) format
    convert --format=mp3 --source="$song".avi --output="$song".mp3
done <songs_to_process.txt

См. BashFAQ #1, чтобы ознакомиться с рекомендациями по построчной обработке входных данных в bash. .

person Charles Duffy    schedule 17.12.2017