2013-04-17 1 views
0

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

+0

возможный дубликат [Использование xargs команды и две команды на перемещение после него] (http://stackoverflow.com/questions/11429234/using-xargs-command- и-два-перемещение-команд следования-его) – fedorqui

ответ

2

Это может быть достигнуто с помощью:

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 

Который я не верю, это результат, который вы после.

0

Использование GNU Parallel:

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 
0

Эта задача может быть решена с использованием только 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