如何使用find编译所有子目录中的所有文件?

时间:2013-03-18 09:48:06

标签: shell find

我有很多c ++程序彼此无关,每个程序只在一个文件中。目录结构如下所示:

dir1
    program1.cpp
    program1.h
    program2.cpp
    program2.h
dir2
    program3.cpp
    program3.h
    program4.cpp
    program4.h
dir3
    program5.cpp
    program5.h
    program6.cpp
    program6.h
..

我正在尝试编写一个shell脚本来编译它们并为可执行文件提供不同的名称。我一直在尝试使用find,如此:

find . -type f -name *.cpp -exec g++ -llibname '{}' \;

这会编译所有文件,但会为每个文件生成a.out,所以我最终只得到一个可执行文件。如何剥离文件扩展名并将其作为可执行文件名? (例如program1.cpp我需要g++ program1.cpp -o program1

2 个答案:

答案 0 :(得分:3)

你可以这样做:

find . -type f -name '*.cpp' -exec sh -c 'g++ {} -o $(basename {} .cpp)' \;

这会将所有可执行文件放在您启动命令的目录中。如果您希望将它们保存在与源文件相同的目录中,则应执行此操作:

find . -type f -name '*.cpp' -exec sh -c 'g++ {} -o $(dirname {})/$(basename {} .cpp)' \;

(请记住引用文件名模式,否则如果当前目录中有.cpp文件,则命令将开始中断。)

答案 1 :(得分:1)

您也可以尝试:

find . -type f -name '*.cpp'| sed 's/.cpp$//' | xargs make