Ich versuche, alle *.o-Dateien aus einem anderen Ordner zu verknüpfen und möchte in meinem Makefile so etwas tun wie:
g++ *.o (folder/*.o and not folder/main.o) -o bin
Gibt es eine Möglichkeit, hier eine Art einfachen regulären Ausdruck zu verwenden?
Antwort1
Versuchen Sie es mit g++ *.o $( echo folder/*.o |tr ' ' "\n" | egrep -v folder/main.o )
, vorausgesetzt, dass der Name keiner von folder/*.o
ihnen LEERZEICHEN enthält.
So funktioniert das:
echo folder/*.o
Erstellt eine durch Leerzeichen getrennte Liste der Dateinamen mit dem Verzeichnis.
tr ' ' "\n"
Ändert alle Leerzeichen in Zeilenumbrüche (was uns einen Dateinamen pro Zeile gibt, was uns egrep
glücklich macht).
egrep -v folder/main.o
Entfernt den unerwünschten Dateinamen aus dieser Liste.
$()
Setzt den Rest der Dateinamen in die Befehlszeile. Da $IFS
die Standardeinstellungen LEERTASTE, TABULATOR und ZEILENUMBAU sind, müssen wir tr
sie nicht wieder in Leerzeichen umwandeln.
Antwort2
Sie sollten Makefiles oder noch besser Autotools verwenden, aber Sie können auch Folgendes tun:
ls folder/ | grep "*.o" | grep -v "main.o" | while read -r file; do g++ $file -o bin; done
Diese Frage würde sowieso auf einer Bash-bezogenen Stack-Site besser beantwortet werden, haha.
Antwort3
Das sollte funktionieren:
ls -1 folder/*.o | grep -v main.o | xargs -I{} g++ {} -o bin
Erläuterung:
ls -1 folder/*.o -> listet alle .o-Dateien (eine pro Zeile) im Ordner folder auf
grep -v main.o -> main.o aus der Liste ausschließen
xargs -I{} g++ {} -o bin -> ausführen "g++ Datei -o bin"