linux遍历文件夹并循环拷贝,关于linux:Makefile循环文件夹并动态获取名称

我有projects,其中包括根项目下的makefile

喜欢

project

-Folder1

-Folder2

-app1

-service1

-Makefile

现在我想进入makefile循环中的文件夹(在根目录下)。即在project下打印文件夹名称,文件夹可以从projectX更改为projectN这一棘手的部分,是否可能?

这就是你要找的吗?只列出在bash中使用ls的目录

@arjoonn-我可以用它在目录上循环并提供每个名称吗?我需要EDOCX1[0]

当然。ls -d */应该列出目录,您可以使用类似for dir in */; do echo $dir; done的东西循环它。

@Arjoonn:注意,如果没有要列出的目录,ls -d */将以非零状态退出。也许不是一个制作配方所期望的。此外,使用shell的循环结构在配方中循环并不是真正的方法。

像这样?

$ tree -F

.

|-- Folder1/

|-- Folder2/

|-- Makefile

|-- app1

`-- service1

2 directories, 3 files

$ cat Makefile

DIRS     := $(notdir $(shell find . -mindepth 1 -maxdepth 1 -type d))

DIRNAMES := $(addprefix print-folder-name-,$(DIRS))

.PHONY: $(DIRNAMES) print-folder-names

print-folder-names: $(DIRNAMES)

$(DIRNAMES): print-folder-name-%:

@printf '%s

' '$*'

$ make print-folder-names

Folder2

Folder1

一切都很简单,很容易理解。唯一微妙的可能是静态模式规则$(DIRNAMES): print-folder-name-%:。它相当于每个文件夹一个规则:

print-folder-name-Folder1:

@printf '%s

' 'Folder1'

print-folder-name-Folder2:

@printf '%s

' 'Folder2'

当然,按照同样的规则,你可以为每个文件夹做任何你喜欢做的事情(除了打印它的名字);只需调整配方即可。$*自动变量扩展为模式的词干(本例中为文件夹名)。

编辑:如果还想打印某些文件夹的特殊内容,还可以使用特定于目标的make变量:

$ cat Makefile

...

print-folder-name-Folder2: SOMEMORETEXT := ' foo'

$(DIRNAMES): print-folder-name-%:

@printf '%s%s

' '$*' $(SOMEMORETEXT)

$ make print-folder-names

Folder2 foo

Folder1

谢谢你1+,可以通过循环完成吗?我需要在make文件中的文件夹列表上运行,对于每个文件夹,我需要执行一些命令…

自然循环。在这个例子中,我展示了它在每个文件夹上循环并打印它的名称。静态模式规则与每个文件夹都有一个单独的规则相同,具有相同的配方。也许看看这个其他的答案来解释。

不确定我明白了…:(你的例子很有效,除了我需要一个循环来打印每个文件夹名…

有什么东西,@printf '%s

' '$*'这个会在循环中……,有可能吗?

@printf '%s

' '$*'已经在一个循环中:make将创建一个循环来构建$(DIRNAMES)变量中列出的所有目标。

是的,我明白了:),有没有一种方法可以将它转换为每个循环?

或者只是为了循环…

抱歉,我不明白您为什么要添加另一个循环以及它可以用来做什么。这是关于shell编程的课程中的作业吗?

哦,不,不是我只想在里面使用if else,例如,如果foldername==Folder2打印foo或者bar的话,我认为这样会更复杂一些。

我真的不明白。是否要打印文件夹名称,foo、bar或其他内容?

抱歉,我想打印文件夹的名称,但是如果我有文件夹,例如"folder2",打印名称,然后只为它添加foo,我只想了解当我需要变量的值时,如何在更复杂的秒内完成它…

编辑了我的答案,向您展示如何使用生成特定于目标的变量。

对不起,我需要离开一会儿,现在我检查一下。

顺便说一句,当我使用代码时,它甚至会打印隐藏的文件夹,如.idea或.git等,是否可以简单地避免?

@Shopiat:当然,只需调整find选项,跳过.*名称(我确信,其他问题已经有了答案)。

非常感谢,我已经回答了这个问题:)如果你能就第一个-mindepth 1 -maxdepth 1和第二个addprefix进行讨论,那就太好了。它们的目的是什么?

我想我理解,不会深入到递归中的其他文件夹。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值