我似乎能够写至少 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
此外,仅仅因为您可以将 260kB 存储在一个xattr
中,这并不意味着它是可取的。我不知道 HFS+,但是在一些 Unixy 文件系统上,属性可以直接存储在 inode 中,但是如果超过一定的限制,则必须在磁盘上为数据分配额外的空间。
————
随着High Sierra和APFS
替换的出现HFS+
,请务必在两个文件系统上进行测试 - 还要确保Time Machineditto
也备份和恢复数据,并且在复制/移动/归档文件时确保诸如tar
和 Finder 等实用程序传播它们.
还要考虑通过电子邮件发送标记文件或将其复制到 FAT 格式的 USB 记忆棒时会发生什么。
我还尝试在单个文件上设置多个属性,以下脚本成功地将 260kB 的 1,000 个属性(称为attr-0
,attr-1
... attr-999
)写入单个文件 - 这意味着该文件有效地携带 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
这些都可以看到和读回 - 我检查了。