Как контролировать размещение параметров xargs?

У меня есть сценарий Bash, который принимает входную папку с исходным кодом и выходной каталог в качестве аргументов. Я хочу иметь возможность компилировать файлы в исходной папке, а затем отправлять их в выходную папку. Проблема в том, что xargs добавляет прочитанные исходные файлы в конец аргумента, вместо которого я хотел бы добавить выходную папку. Как я могу контролировать размещение аргументов xargs? Вот что я хочу сделать: find $source -name '*.c' | xargs gcc <files> $output


person user1049697    schedule 17.04.2013    source источник


Ответы (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