У меня есть сценарий Bash, который принимает входную папку с исходным кодом и выходной каталог в качестве аргументов. Я хочу иметь возможность компилировать файлы в исходной папке, а затем отправлять их в выходную папку. Проблема в том, что xargs
добавляет прочитанные исходные файлы в конец аргумента, вместо которого я хотел бы добавить выходную папку. Как я могу контролировать размещение аргументов xargs
? Вот что я хочу сделать: find $source -name '*.c' | xargs gcc <files> $output
Как контролировать размещение параметров xargs?
comment
возможный дубликат с использованием команды xargs и двух следующих за ней команд перемещения а>
- person fedorqui 'SO stop harming'   schedule 17.04.2013
Ответы (3)
Этого можно достичь с помощью:
find $source -name '*.c' | xargs gcc -o $output
Это определяет вывод gcc
перед передачей ему списка исходных файлов.
Эту проблему нельзя решить, изменив расположение аргумента xargs, как если бы вы это сделали:
find $source -name '*.c' | xargs -I source gcc source -o $output
Что будет работать, если вы получите source/a.c
и source/b.c
, возвращенные из find
:
gcc source/a.c -o $output
gcc source/b.c -o $output
Я не верю, что это результат, которого вы добиваетесь.
person
imp25
schedule
17.04.2013
Используйте параллельный GNU:
find $source -name '*.c' | parallel gcc {} -o $output/{.}
Или, если вам нужны все файлы в {}:
find $source -name '*.c' | parallel -Xj1 gcc {} -o $output
Узнайте больше о GNU Parallel: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 а>
10 секундная установка:
wget pi.dk/3 -qO - | sh -x
person
Ole Tange
schedule
17.04.2013
Эту задачу также можно решить, используя только Bash:
#!/bin/sh
if [ $# -ne 2 ]; then
echo "usage: $0 [srcdir] [bindir]"
exit 1
fi
src_dir="${1%/}"
bin_dir="${2%/}"
for src in "$src_dir"/*.c; do
bin="$(basename "${src%.c}")"
gcc "$src" -o "$bin_dir/$bin"
done
person
Community
schedule
17.04.2013