Shell脚本CP无法覆盖目录

时间:2015-05-21 16:00:17

标签: macos shell terminal cp sparkle

我们的用户编写了一个shell脚本,将应用程序复制到OSX上的/ Applications文件夹中。它第一次运行很好,但第二次出错。这是一个新的开发,它显然在我们更改App名称之前工作正常。

shell脚本运行以下命令:

cp -a ApplicationName.app /Applications
open -a '/Applications/ApplicationName.app/Contents/MacOS/ApplicationName' --args -LSRC autolaunch

第一次运行时,它运行正常,应用程序被复制然后启动。第二次出现以下错误

[jrivera@chamomile] $ sudo ./InstallScript.sh /SRNM ABC1234567
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Headers with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Headers
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Resources with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Resources
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr_CA.lproj
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/pt.lproj with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/pt.lproj
cp: cannot overwrite directory /Applications/ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/Current with non-directory ApplicationName.app/Contents/Frameworks/Sparkle.framework/Versions/Current

我不确定为什么会发生这种情况。它是在完全相同的位置完全相同的脚本,复制完全相同的东西相隔30秒。我挖到每个目录和文件都显示完全相同的文件类型。我尝试将其他命令添加到cp以强制它(-RfXv)但是得到了相同的东西。有任何想法吗?也许它闪耀着奇怪的东西?

1 个答案:

答案 0 :(得分:1)

我怀疑有问题的文件/目录有一些扩展属性,并且cp在具有这些属性时覆盖目标时遇到问题。 (保留权限时cp在不同平台上看起来通常不可靠。)

鉴于此,需要探索几种解决方法:

  • 删除目标/Applications/ApplicationName.app,然后重新复制它。
  • 使用rsync,例如,

    rsync -vaz ApplicationName.app/ /Applications/ApplicationName.app

首先删除目标可能会在更新时干扰使用它的人; rsync以递增方式工作(并且几乎总是比cp更快地更新。)