Estoy intentando vincular todos los archivos *.o de otra carpeta y me gustaría hacer algo como en mi Makefile;
g++ *.o (folder/*.o and not folder/main.o) -o bin
¿Hay alguna manera de que pueda utilizar algún tipo de expresión regular simple aquí?
Respuesta1
Inténtalo g++ *.o $( echo folder/*.o |tr ' ' "\n" | egrep -v folder/main.o )
, suponiendo que ninguno folder/*.o
tenga ESPACIOS en sus nombres.
Así es como funciona:
echo folder/*.o
produce una lista separada por espacios de los nombres de archivos, con el directorio.
tr ' ' "\n"
cambia todos los espacios a nuevas líneas (dándonos un nombre de archivo por línea, lo cual nos egrep
alegra.
egrep -v folder/main.o
Elimina el nombre de archivo no deseado de esta lista.
$()
Coloca el resto de los nombres de archivo en la línea de comando. Dado que $IFS
los valores predeterminados son ESPACIO, TAB, NUEVA LÍNEA, no lo hacemos Tengo que tr
volver a los espacios.
Respuesta2
Deberías usar archivos MAKE, o incluso mejores herramientas automáticas, pero puedes hacer algo como esto:
ls folder/ | grep "*.o" | grep -v "main.o" | while read -r file; do g++ $file -o bin; done
De todos modos, esta pregunta se respondería mejor en un sitio de pila relacionado con bash, jaja.
Respuesta3
Esto debería funcionar:
ls -1 folder/*.o | grep -v main.o | xargs -I{} g++ {} -o bin
Explicación:
ls -1 carpeta/*.o -> enumera todos los archivos .o (uno por línea) en la carpeta carpeta
grep -v main.o -> excluir main.o de la lista
xargs -I{} g++ {} -o bin -> ejecutar "archivo g++ -o bin"