Einfache Möglichkeit, alle .o-Dateien bis auf eine abzurufen

Einfache Möglichkeit, alle .o-Dateien bis auf eine abzurufen

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/*.oihnen LEERZEICHEN enthält.

So funktioniert das:

echo folder/*.oErstellt 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 egrepglücklich macht).
egrep -v folder/main.oEntfernt den unerwünschten Dateinamen aus dieser Liste.
$()Setzt den Rest der Dateinamen in die Befehlszeile. Da $IFSdie Standardeinstellungen LEERTASTE, TABULATOR und ZEILENUMBAU sind, müssen wir trsie 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"

verwandte Informationen