2015-05-21 116 views
0

我们的用户编写了一个shell脚本来将应用程序复制到OSX上的/ Applications文件夹中。它第一次效果很好,但第二次出现错误。这是一个新的发展,在我们更改应用程序名称之前,它显然已经正常工作。Shell脚本CP无法覆盖目录

shell脚本运行如下:

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

它第一次运行时,它工作正常,应用程序在复制,然后将其启动。第二次它带回以下错误

[[email protected]] $ 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),但得到了同样的结果。有任何想法吗?也许这是一个奇怪的事情闪闪发光?

回答

0

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

鉴于此,有几个解决方法探索:

  • 重新复制之前删除目标/Applications/ApplicationName.app
  • 使用rsync,例如

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

第一卸下目标可使用它,而要更新它的人干扰; rsync递增地工作(并且几乎总是比cp更快地更新)。