【问题标题】:How to have "make clean" ignore folders when deleting删除时如何让“make clean”忽略文件夹
【发布时间】:2021-05-24 06:13:57
【问题描述】:

我得到了一个 Makefile 的任务,它给了我一个 make clean 命令。通过设置存储库的方式,它会删除 /bin 和 /out 文件夹中的所有内容,但名为 .gitignore 的文件除外。这是命令的样子:

clean:
    find out/ ! -name .gitignore -type f -delete && \
    find bin/ ! -name .gitignore -type f -delete

现在我正在做我的项目,我需要将内容存储在一个名为 /bin/fonts 和 /bin/word_lists 的文件夹中。我正在尝试修改命令以使其忽略这两个文件。唯一的问题是,我不知道这些命令是用什么语言编写的,所以我什至不知道从哪里开始查看语法。有人能指出我正确的方向吗?我尝试过这样的事情:

clean:
    find out/ ! -name .gitignore -type f -delete && \
    find bin/ ! -name .gitignore ! -name fonts/FreeSans.ttf -type f -delete

但它仍然会删除字体中的所有内容,即使它确实按照我想要的方式工作,也不能真正解决将每个字体保存在文件夹中的问题。

我也试过这个:

clean:
    find out/ ! -name .gitignore -type f -delete && \
    find ./bin -mindepth 1 ! -name .gitignore ! -regex '^./fonts/\(/.*\)?' ! -regex '^./word_lists/\(/.*\)?' -delete

在这篇文章之后,它反而删除了所有内容,包括文件夹 bin/fonts 以及 bin/word_lists。

任何帮助将不胜感激!

【问题讨论】:

  • 制作食谱是用 POSIX shell 语法编写的。但是,shell 脚本从根本上说是运行其他程序的一种方式。在这种情况下,正在运行的程序是find。因此,您应该在互联网上(尝试类似unix find)或在您的系统上(运行man find)查找find 程序的文档。
  • 我个人强烈建议您NOT将您想要保留的内容放在bin 的子目录中。为什么不把它们放在别的地方呢?这会让你的生活变得更简单。

标签: unix makefile


【解决方案1】:

-name 不检查完整的文件路径,它只匹配文件名(所以-name FreeSans.ttf 会匹配,但匹配任何目录中的此文件名)。

您要查找的谓词称为-path,但您需要为整个路径指定一个模式。

clean:
    find out/ bin/ ! -name .gitignore ! -path 'bin/fonts/*
 ! -path 'bin/word_lists/*' -type f -delete

(请注意我如何压缩find 以同时遍历两个目录。我假设您的意思是bin 而不是/bin;也许另见Difference between ./ and ~/)

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多