Manera sencilla de obtener todos los archivos .o menos uno

Manera sencilla de obtener todos los archivos .o menos uno

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/*.otenga ESPACIOS en sus nombres.

Así es como funciona:

echo folder/*.oproduce 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 egrepalegra.
egrep -v folder/main.oElimina 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 $IFSlos valores predeterminados son ESPACIO, TAB, NUEVA LÍNEA, no lo hacemos Tengo que trvolver 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"

información relacionada