cp-不要在 makefile 中覆盖

cp-不要在 makefile 中覆盖

在我的项目的 makefile 中,我希望仅当文件在目标文件夹中尚不存在时才复制配置文件。目前我正在使用:

cp -n

然而,最近有人告诉我他们收到了“无效选项”错误。

我的问题是:对于 makefile,是否有比 cp -n 更兼容的方法来实现这一点?

(注意:cp -u 不是我想要的,如果文件已经存在,即使它比源文件旧,也不应该将其替换。)

答案1

怎么样:

#!/bin/bash
if ! [ -e /path/to/foo ]
then
    cp foo /path/to/
fi

更好的是,如果这是一个可能具有新的、有用的选项的配置文件,您可以:

#!/bin/bash
if ! [ -e /path/to/foo ]
then
    cp foo /path/to/
else
    cp -f foo /path/to/foo.new
fi

以便他们仍然有一份可以参考的副本。

答案2

我认为您的 Makefile 中的命令只是 bash?如果是这样,您可以尝试使用 bash if 条件,该条件取决于文件是否存在:

if [ -f $FILE ];
then
   #echo "File $FILE exists"
else
   #echo "File $FILE does not exists"
   cp $SRC_FILE $FILE
fi

来自这里的 Bash 代码

如果你发现 Makefile 运行在不根据​​ bash 进行内容评估的环境中,那么你也许可以使用同步(应该安装在大多数 unixy 机器上)用于复制操作。虽然我刚刚浏览了手册页,没有看到仅当目标不存在时才进行复制的标志 - 但我仍然认为 rsync 必须适应这一点,只需找到要使用它的目标标志即可。

答案3

我在 Makefile 中遇到了同样的问题。奇怪的是“cp -n”在同一个 shell 中起作用。想知道为什么吗?!

这是我的解决方案,比 if then else 稍微简短一些

test -e folder/requirements.txt || cp -p ../requirements.txt folder/requirements.txt

相关内容