“cp -f”失败,因为“文件已存在”

“cp -f”失败,因为“文件已存在”

我有一个正在运行的安装后脚本cp -f ./foo/a.json ./node_modules/bar/a.json,但它失败并出现文件已存在的错误(它确实存在,但我试图用我自己的版本覆盖它)。

即使文件存在,该标志的全部意义难道不是-f确保它是强制覆盖吗?

我尝试覆盖任何可能的别名...相同的结果cp\cp这是在正在运行的 docker 构建执行中发生的npm install,然后启动 npm postinstall 脚本。

以下是按要求的 docker 构建输出示例:

#10 82.12 npm WARN lifecycle [email protected]~postinstall: cannot run in wd [email protected] node -e "try{require('./postinstall')}catch(e){}" (wd=/node_modules/core-js)
#10 82.22 
#10 82.22 > [email protected] postinstall /usr/local/lib/node_modules/xxx-cli
#10 82.22 > command cp -f ./foo/a.json ./node_modules/xxx-library/assets/a.json
#10 82.22 
#10 82.31 cp: can't create './node_modules/xxx-library/assets/a.json': File exists

任何帮助表示赞赏!

答案1

不,那不是-f目的。 GNU coreutils' cp(我认为你正在使用它,cp因为你说你已经有了linux并运行了bash)默认覆盖内容现有目标文件。 (您需要使用 明确禁用它-n。)

如果目标文件存在,但无法打开(无论出于何种原因),-f请进行更改并删除该文件,然后创建一个新文件,然后用原始数据填充该文件。这似乎既不能解决也不是当前的问题。

你可能想成为非常逐字记录错误消息的措辞。

无论如何,cat ./foo/a.json > ./node_modules/bar/a.json有用吗?它实际上与您的相同cp ./foo/a.json ./node_modules/bar/a.json,因为它只是用源覆盖目标的内容。

答案2

从问题移开,因为它是答案:

事实证明,这整个问题毫无意义。有问题的 dockerfile 正在使用-g全局安装的模块调用 npm install ,所以我认为我无法覆盖node_modulesbcos 权限中的文件,或者因为它们没有位于我认为的位置。删除-g并替换它ci会使一切按预期工作。

相关内容