私は別のフォルダーからすべての *.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"
すべてのスペースを改行に変更します (1 行に 1 つのファイル名が表示されるので、便利です) egrep
。
egrep -v folder/main.o
このリストから不要なファイル名を削除します。
$()
残りのファイル名をコマンド ラインに入力します。$IFS
デフォルトでは SPACE、TAB、NEWLINE になっているため、スペースに戻す必要はありませんtr
。
答え2
makefile を使用するか、またはさらに良い方法として 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 -> フォルダー folder 内のすべての .o ファイルを一覧表示します (1 行に 1 つずつ)
grep -v main.o -> リストから main.o を除外する
xargs -I{} g++ {} -o bin -> "を実行g++ ファイル -o bin「