Unix 如何在Makefile中获取目录内容及其路径的非递归列表?

Unix 如何在Makefile中获取目录内容及其路径的非递归列表?,unix,makefile,ls,Unix,Makefile,Ls,我的项目的目录结构如下: 我的Makefile如下所示: dir1_contents = $(shell ls dir1/*) dir3_contents = $(shell ls dir3/*) all: clean_dir1 clean_dir3 clean_dir1: echo 'dir1_contents = $(dir1_contents)' clean_dir3: echo 'dir3_contents = $(dir3_contents)' 当我运行mak

我的项目的目录结构如下:

我的Makefile如下所示:

dir1_contents = $(shell ls dir1/*)
dir3_contents = $(shell ls dir3/*)

all: clean_dir1 clean_dir3

clean_dir1:
    echo 'dir1_contents = $(dir1_contents)'

clean_dir3:
    echo 'dir3_contents = $(dir3_contents)'
当我运行make时,我得到的是:

$ pwd
make-test

$ make -s
dir1_contents = dir1/file2.junk  dir1/dir2: file1.junk
dir3_contents = dir3/file3.junk
我想在
dir1\u contents
中获取
dir1
的内容。但我不想要递归内容。仅显示
dir1
目录下的内容。我怎么做

如果我从Makefile的前两行中删除
/*
,我就会得到想要的正确内容。但他们却迷失了方向,我也需要:

$ pwd
make-test

$ make -s
dir1_contents = dir2 file2.junk
dir3_contents = file3.junk

如何使用我需要的文件路径获得我想要的正确内容?

您遇到的问题与
ls
的工作方式有关,与GNU make无关。如果运行
ls dir1/*
,则shell会在调用
ls
之前展开通配符,因此这与运行相同:

ls dir1/dir2 dir1/file2.junk
当您
ls
a目录时,默认情况下会显示该目录的内容,因此输出为:

$ ls dir1/dir2 dir1/file2.junk
dir1/file2.junk

dir1/dir2:
file1.junk
(继续并在命令提示下尝试此操作)。因为这是贝壳的图案,这就是你得到的结果

如果只想查看目录而不想查看目录中的文件,可以将
-d
选项添加到
ls
命令:

$ ls -d dir1/dir2 dir1/file2.junk
dir1/file2.junk dir1/dir2
或者,在makefile中:

dir1_contents = $(shell ls -d dir1/*)
dir3_contents = $(shell ls -d dir3/*)
然而,我认为这无论如何都不是一个很好的方法。为什么不使用GNU make的内置通配符功能呢?除了更易于理解之外,它还具有更高的可移植性和更高的效率(上面的版本需要调用shell和
ls
程序)。我还建议您使用
:=
而不是
=
,以便只执行一次通配符操作:

dir1_contents := $(wildcard dir1/*)
dir3_contents := $(wildcard dir3/*)

您遇到的问题与
ls
的工作方式有关,与GNU make无关。如果运行
ls dir1/*
,则shell会在调用
ls
之前展开通配符,因此这与运行相同:

ls dir1/dir2 dir1/file2.junk
当您
ls
a目录时,默认情况下会显示该目录的内容,因此输出为:

$ ls dir1/dir2 dir1/file2.junk
dir1/file2.junk

dir1/dir2:
file1.junk
(继续并在命令提示下尝试此操作)。因为这是贝壳的图案,这就是你得到的结果

如果只想查看目录而不想查看目录中的文件,可以将
-d
选项添加到
ls
命令:

$ ls -d dir1/dir2 dir1/file2.junk
dir1/file2.junk dir1/dir2
或者,在makefile中:

dir1_contents = $(shell ls -d dir1/*)
dir3_contents = $(shell ls -d dir3/*)
然而,我认为这无论如何都不是一个很好的方法。为什么不使用GNU make的内置通配符功能呢?除了更易于理解之外,它还具有更高的可移植性和更高的效率(上面的版本需要调用shell和
ls
程序)。我还建议您使用
:=
而不是
=
,以便只执行一次通配符操作:

dir1_contents := $(wildcard dir1/*)
dir3_contents := $(wildcard dir3/*)

dir1\u contents=dir1/$(shell ls dir1)
igagis,这不起作用:这个解决方案可以纠正:
dir1\u contents=$(addprefix dir1/,$(shell ls dir1))
,但我还是稍微喜欢我的解决方案。这里的后续问题:
dir1\u contents=dir1/$(shell ls dir1)
igagis,这不起作用:该解决方案可以更正:
dir1\u contents=$(addprefix dir1/,$(shell ls dir1))
,但我仍然更喜欢我的解决方案。这里的后续问题:这里的后续问题:这里的后续问题: