【问题标题】:How to search subdirectories for .c files and compile them (shell scripting)如何在子目录中搜索 .c 文件并编译它们(shell 脚本)
【发布时间】:2013-05-18 05:54:33
【问题描述】:

我需要一个参数,它是当前目录的目录并搜索其文件夹并编译这些文件夹中的任何 C 文件。我刚刚开始在 Bash 中编写 shell 脚本,而且有点过头了。

到目前为止,我尝试过的事情包括使用 find 搜索文件,然后将其通过管道传输到 xargs 进行编译,但一直收到错误消息,指出 testing.c 不是目录。

find ~/directory -name *.c | xargs gcc -o testing testing.c

我也尝试使用 ls -R 在文件夹中搜索 .c 文件,但不知道如何将路径作为参数然后移动到并编译?

【问题讨论】:

  • ... 将它们全部编译成一个对象?
  • 为这类任务写一个makefile。
  • 不,我不希望他们一起编译,Ignacio 所以我知道现在无论如何都行不通了。我有一个 makefile shx2 的快速谷歌,但不认为这是一个选项。问题是一个作业,只是要求一个脚本。我想我需要以某种方式获取 ls 的输出并执行 if 语句来检查是否确实存在 .c 文件,然后移动该目录并编译它们。那我会走上正轨吗?
  • 您编写的命令将在目录下查找 .c 文件,然后将它们的相对路径附加到 gcc -o testing testing.c命令。本质上,它会尝试将它们全部编译成一个名为testing 的二进制文件,这可能不是您想要的。默认情况下,find 和 xargs 都不会 chdir 进入找到的子目录。

标签: bash shell subdirectory


【解决方案1】:
find ~/directory -type f -name "*.c" -print0 |
while IFS= read -r -d '' pathname; do
    gcc -o "${pathname%.c}" "$pathname"
done

【讨论】:

    【解决方案2】:
    find directory -type f -name "*.c" -exec sh -c \
      'cd $(dirname $1);make $(basename $1 .c)' sh {} \;
    

    【讨论】:

    • 我认为您不需要在 {} 之前使用 sh
    • @JonathanLeffler 有些东西需要放在这里变成 $0 ,这可能会混淆用作 dirname 和 basename 参数。为了清楚起见,我使用sh,但它可以是任何字符串。
    • OK - 足够公平...您似乎是正确的,您可以指定$0 以及其他参数,并且sh 至少与$0 一样好和大多数人一样,而且比大多数人都好。
    • @JonathanLeffler s/似乎是/是/
    【解决方案3】:

    正如@shx2 建议的那样,使用make(或其他一些构建系统)可以说是最好的方法。如果没有适当的构建系统,您不想在某个源代码树中编译文件。

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多