Это должно работать:
ls -1 folder/*.o | grep -v main.o | xargs -I{} g++ {} -o bin
Объяснение:
ls -1 folder / *. O -> перечислить все файлы .o (по одному в строке) в папке папки
grep -v main.o -> исключить main.o из списка
xargs -I {} g ++ {} -o bin -> выполнить " файл g ++ -o bin "
Вы должны использовать make-файлы, или даже лучше автоинструментальные средства, но вы можете сделать что-то вроде этого:
ls folder/ | grep "*.o" | grep -v "main.o" | while read -r file; do g++ $file -o bin; done
На этот вопрос лучше было бы ответить в любом случае, связанном с bash, хаха.
Попробуйте g++ *.o $( echo folder/*.o |tr ' ' "\n" | egrep -v folder/main.o )
, предполагая, что ни у одного из folder/*.o
нет ПРОСТРАНСТВ в их именах.
Вот как это работает:
echo folder/*.o
создает разделенный пробелами список имен файлов с каталогом.
tr ' ' "\n"
заменяет все пробелы на новые строки (давая нам одно имя файла на строку, что делает egrep
счастливым.
egrep -v folder/main.o
удаляет нежелательное имя файла из этого списка.
$()
помещает остальные имена файлов в командную строку. Так как $IFS
по умолчанию использует SPACE, TAB, NEWLINE, нам не нужно tr
возвращать их обратно в пробелы.