Makefile:生成所有子文件夹的zip文件

Makefile:生成所有子文件夹的zip文件,makefile,Makefile,我正在尝试从我的临时构建脚本过渡,该脚本迭代项目主页的所有子项,并为每个子项创建相应的zip文件: for i in */; do if [[ -d $i ]]; then echo "Processing folder $i"; zip "${i%/}.zip" "$i"*.txt echo "Created ${i%/}.zip" fi done; 第一行很笨拙,但它只是在所有子曲面(不包括隐藏子曲面)中迭代。正如您所看到的,

我正在尝试从我的临时构建脚本过渡,该脚本迭代项目主页的所有子项,并为每个子项创建相应的zip文件:

for i in */; do
    if [[ -d $i ]]; then
        echo "Processing folder $i";
        zip "${i%/}.zip" "$i"*.txt
        echo "Created ${i%/}.zip"
    fi
done;
第一行很笨拙,但它只是在所有子曲面(不包括隐藏子曲面)中迭代。正如您所看到的,逻辑很简单,但是在Makefile中执行此操作而不显式指定每个子目录似乎很困难

理想情况下,我们应该从以下方面开始:

project
  subdir1
    file1.txt
    file2.txt
  subdir2
    file3.txt
…并最终导致:

project
  subdir1
    file1.txt
    file2.txt
  subdir1.zip
  subdir2
    file3.txt
  subdir2.zip
有没有一种方法可以安全地实现这种递归


编辑:已清理基本脚本,谢谢Etan

类似的内容可能会满足您的需要

SUBDIRS := $(wildcard */)
ZIPS := $(addsuffix .zip,$(subst /,,$(SUBDIRS)))

$(ZIPS) : %.zip : | %
    zip $@ $*/*.txt

dist: $(ZIPS)

您可能需要调整该静态模式规则的先决条件,等等,以获得正确的重建行为(应在需要重建时进行检测,应始终重建,应在
.zip
文件存在时从不重建,等等)。

类似的操作可能会满足您的需要

SUBDIRS := $(wildcard */)
ZIPS := $(addsuffix .zip,$(subst /,,$(SUBDIRS)))

$(ZIPS) : %.zip : | %
    zip $@ $*/*.txt

dist: $(ZIPS)

您可能需要调整该静态模式规则的先决条件等,以获得正确的重建行为(应在需要重建时进行检测,应始终重建,应在
.zip
文件存在时从不重建,等等).

您的原始脚本对于带有空格或shell元字符的目录不安全仅供参考。对i in*/使用
;尽管如此,我还是会这么做。根据
zip
处理输入的方式,内部查找在文件名中的空格/换行符方面可能存在类似的问题。如果您的树没有使用
zip“$i.zip”“$i”/*.txt
/等进行深度嵌套,则更安全。如果愿意,您可以将该脚本放入生成文件的目标中。@EtanReisner感谢您对该脚本的评论(将对其进行编辑)。我知道我可以把它放到一个Makefile中,但是我在想也许有一种“正确”的方法可以在make语法中实现。你只需要压缩顶级目录吗?如果您想在make中执行此操作,可以对目录进行全局化,并为所有目录创建目标。@EtanReisner是的,只需顶层。我想那正是我想要的。这里有类似的问题:。谢谢你的帮助!您的原始脚本对于带有空格或shell元字符的目录不安全仅供参考。对i in*/使用
;尽管如此,我还是会这么做。根据
zip
处理输入的方式,内部查找在文件名中的空格/换行符方面可能存在类似的问题。如果您的树没有使用
zip“$i.zip”“$i”/*.txt
/等进行深度嵌套,则更安全。如果愿意,您可以将该脚本放入生成文件的目标中。@EtanReisner感谢您对该脚本的评论(将对其进行编辑)。我知道我可以把它放到一个Makefile中,但是我在想也许有一种“正确”的方法可以在make语法中实现。你只需要压缩顶级目录吗?如果您想在make中执行此操作,可以对目录进行全局化,并为所有目录创建目标。@EtanReisner是的,只需顶层。我想那正是我想要的。这里有类似的问题:。谢谢你的帮助!嗯,当我在一个测试目录中运行它时,我得到了一个关于zip模式的错误:
zip警告:名称不匹配:%*/*.txt
。我必须看一看具体的替换错误,但你的解决方案正是我想要的。那是因为我键入了它。试试
$*/*.txt
.Hmm,当我在测试目录中运行它时,我发现zip的模式没有找到:
zip警告:名称不匹配:%*/*.txt
。我必须看一看具体的替换错误,但你的解决方案正是我想要的。那是因为我键入了它。试试
$*/*.txt