Я пытаюсь связать все файлы *.o из другой папки и хотел бы в своем Makefile сделать что-то вроде:
g++ *.o (folder/*.o and not folder/main.o) -o bin
Можно ли здесь как-то использовать простое регулярное выражение?
решение1
Попробуйте 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
по умолчанию используются ПРОБЕЛ, ТАБЛИЦА, НОВАЯ СТРОКА, нам не нужно tr
заменять их обратно пробелами.
решение2
Вам следует использовать makefiles или, что еще лучше, autotools, но вы можете сделать что-то вроде этого:
ls folder/ | grep "*.o" | grep -v "main.o" | while read -r file; do g++ $file -o bin; done
В любом случае, на этот вопрос лучше ответить на сайте, посвященном стеку bash, ха-ха.
решение3
Это должно сработать:
ls -1 folder/*.o | grep -v main.o | xargs -I{} g++ {} -o bin
Объяснение:
ls -1 folder/*.o -> вывести список всех файлов .o (по одному в строке) в папке folder
grep -v main.o -> исключить main.o из списка
xargs -I{} g++ {} -o bin -> выполнить "g++ файл -o bin"