在我的项目的 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
如果你发现 Makefile 运行在不根据 bash 进行内容评估的环境中,那么你也许可以使用同步(应该安装在大多数 unixy 机器上)用于复制操作。虽然我刚刚浏览了手册页,没有看到仅当目标不存在时才进行复制的标志 - 但我仍然认为 rsync 必须适应这一点,只需找到要使用它的目标标志即可。
答案3
我在 Makefile 中遇到了同样的问题。奇怪的是“cp -n”在同一个 shell 中起作用。想知道为什么吗?!
这是我的解决方案,比 if then else 稍微简短一些
test -e folder/requirements.txt || cp -p ../requirements.txt folder/requirements.txt