19

我想将文件复制到使用scp. 但我想在我的 makefile 中使用我当前的文件夹名称作为变量。

我知道我得到了我当前的路径,$(CURDIR)但我的本地路径在我的远程服务器上不一样。

例如,我的路径是/Users/obstschale/Documents/Lab2/,我想将 Lab2.tar 复制到user@server.au:/home/path/Lab2/.

copy2server:
    echo $(CURDIR)
    scp Lab2.tar user@server.au:/home/path/{folder}

我可能不得不$(CURDIR)输入一些东西并找到我的最后一个文件夹。

更新:$(CURDIR)是正确的变量。$(CURID)是错误的,至少它对我不起作用。

4

4 回答 4

29

正如 Sylvain 所描述的那样,我对 makefile(GNU Make 3.81)中的反引号语法并不满意。如果它也不适合您,请使用

$(shell basename $(CURDIR))

代替

`basename $(CURDIR)`
于 2013-03-17T10:53:11.520 回答
8

我试过这个规则:

test:
    @echo $(CURDIR)           # e.g. /tmp/foobar/blafoor/baz
    @echo $(notdir $(CURDIR))  # gives "baz" here.

这对我来说很好。

也许这不是为了工作,因为notdir应该

提取每个文件名的非目录部分。

于 2014-07-10T14:34:05.873 回答
6

如果您要删除路径中的最后一个文件夹名称,则有许多内置的 makefile 函数。有关文件操作的快速概述,请参见http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html#SEC74

copytoserver:
    scp Lab2.tar user@server.au:/home/path/$(notdir $(CURDIR))

这其中的关键项目当然是$(notdir $(CURDIR))。正如您所发现的,其中$(CURDIR)包含运行 makefile 的目录的路径,没有最后的“/”。该notdir函数会删除文件名中最后一个“/”之前的所有内容。这最终会剥离除最终目录之外的所有内容。

如果$(CURDIR)仍然有尾随的'/',你可以把它去掉,这样notdir函数就会做你想做的事情:

$(notdir $(patsubst %/,%,$(CURDIR)))

请注意,在这种情况下,间距非常重要,在任何逗号之前或之后放置一个空格都会在它进行贪婪模式替换时插入一个空格。

于 2014-01-02T22:28:58.853 回答
5

您可以使用basenameshell 命令提取$(CURDIR).

copyserver:
   folder=`basename "$(CURDIR)"`; scp Lab2.tar user@server.au:/home/path/${folder}
于 2013-03-17T10:45:46.280 回答