我似乎可以写入至少260kB的内容,方法是生成260kB的空字符,并将它们转换为字母a
,以便我能够看到它们:
xattr -w myattr "$(dd if=/dev/zero bs=260000 count=1|tr '\0' a)" fred
1+0 records in
1+0 records out
260000 bytes transferred in 0.010303 secs (25235318 bytes/sec)
然后使用以下方式读取它们:
xattr -l fred
myattr: aaaaaaaaaaaaaaaaaa...aaa
并检查返回的长度:
xattr -l fred | wc -c
260009
我怀疑这实际上是命令行ARGMAX的限制:
sysctl kern.argmax
kern.argmax: 262144
此外,仅因为您可以在
xattr
中存储260kB,这并不意味着这是可取的。我不知道HFS+的情况,但在某些类Unix文件系统中,属性可以直接存储在inode中,但如果超过一定限制,则需要为数据在磁盘上分配额外空间。
———
随着High Sierra和APFS取代HFS+的出现,请确保在两个文件系统上进行测试-还要确保Time Machine备份和还原数据,以及在复制/移动/归档文件时像ditto、tar和Finder这样的工具传播它们。
此外,请考虑将标记的文件发送电子邮件或将其复制到格式为FAT的USB内存棒时会发生什么。
我还尝试在单个文件上设置多个属性,并且以下脚本成功地将1,000个属性(称为
attr-0
、
attr-1
…
attr-999
)每个大小为260kB写入单个文件中-这意味着该文件实际上携带了260MB的属性。
#!/bin/bash
for ((a=1;a<=1000;a++)) ; do
echo Setting attr-$a
xattr -w attr-$a "$(dd if=/dev/zero bs=260000 count=1 2> /dev/null | tr '\0' a)" fred
if [ $? -ne 0 ]; then
echo ERROR: Failed to set attr
exit
fi
done
这些都可以被看到和读取 - 我已经检查过了。
tag
包,非常喜欢它。你可以非常简单地添加、删除和更新文件的标签,并在 Finder 中查看它们。 - Mark Setchellxattr
。无论如何,问题仍然存在,xattr
可以容纳多大的数据? - Rho Phi/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/unistd.h
中被定义为26,但我认为这并不意味着您可以存储26位,甚至其大小可能不超过26位。我认为这是因为所有周围的#defines
都在26左右按顺序编号。 - Mark Setchell