我正在尝试使用OSX"xattr"实用程序将扩展属性从一个文件复制到另一个文件。背景是,我们正在构建一个备份工具,文件/结构必须保留所有属性、ACL等。除了像资源叉这样的大属性外,一切都很好。使用下面的方法,小属性可以很好地工作。在OS X 10.7.5上尝试此操作以下是我正在做的:
首先,我使用"ls-l@"标识文件上的属性。结果如下:
-rwxrwxrwx@ 1 testuser staff 0 3 Jan 2011 File
com.apple.FinderInfo 32
com.apple.ResourceFork 237246
现在我导出属性(com.apple.ResourceFork是导致问题的原因):
xattr -px com.apple.ResourceFork File > attribfile
我现在想使用以下命令将此属性应用于另一台mac上的文件副本:
xattr -wx com.apple.ResourceFork "`cat attribfile`" File
这导致:
-bash: /usr/bin/xattr: Argument list too long
我想我知道为什么会发生。。。资源分叉数据太长,无法放入参数中。我还没有确定它开始突破的阈值,但我怀疑这与ARG_MAX有关。xargs在这里没有帮助,因为它不是几个较小的参数,而是一个非常大的参数。
所以多个问题:
- 有没有办法让xattr接受这个大值?以某种方式通过标准输入输入?手册页没有显示,但我不是专家,也许有一些创造性的方法可以做到这一点
- 有人能告诉我使用股票命令行工具应用大型扩展属性的正确方法吗
- 如果没有库存命令行工具,对第三方工具有什么建议吗
我不知道用xattr
做这件事的方法,但有一个旧的文件系统技巧可以使用。注:这基本上已经过时,但在10.8.2中仍然有效;我对10.8.3等没有任何承诺。如果attribfile是十六进制格式,请使用以下内容:
xxd -r -p attribfile >File/..namedfork/rsrc
如果属性文件是原始的,请使用cat
而不是xxd -r -p
。如果属性不是资源叉。。。我不知道。
接受的答案对我不起作用,所以我继续并找到了另一个解决方案,我将其发布在这里,以防其他人需要。
我的问题是将vlc-2.1.4复制到/Applications文件夹。它一直在说:
The Finder can’t complete the operation because some data in “VLC” can’t be read or written.
(Error code -36)
如果我尝试在终端中使用cp
,我会得到这个线程中指示的错误。
因此,我所做的是在控制台中执行以下命令(总结VLC的tar
并在其目的地中取消标记,因此……它可以作为cp
工作):
cd /Volumes/vlc-2.1.4/
tar cf /Applications/vlc.tar VLC.app
cd /Applications/
tar xf vlc.tar
rm vlc.tar
我希望这对其他有同样问题的人有用。