Простой способ получить все файлы .o, кроме одного

Простой способ получить все файлы .o, кроме одного

Я пытаюсь связать все файлы *.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"

Связанный контент