如何在Mac OS X中删除文件上的“扩展属性”?


260

我有一个运行压力测试的AppleScript脚本。测试的一部分是打开,保存和关闭某些文件。文件以某种方式获取了一些“扩展属性”,这些属性禁止保存文件。这导致压力测试失败。

如何删除扩展属性?


扩展属性不能防止文件被保存。您确定这不是权限问题还是ACL?
莉莉·巴拉德

您是否刚刚升级到10.7.3?似乎存在一个错误,许多GUI应用程序(包括TextEdit,但其他应用程序-包括我自己写的并没有做任何奇怪事情的应用程序)现在都将文件的隔离位设置了。正如@Bavarious所说,您可以使用@ xattr @将其删除。查看免费的TextWrangler,我认为它具有很好的AppleScript支持。有人告诉我它没有设置隔离位。
Abhi Beckert 2012年

6
如果以下内容有效,则您应该接受答案-这有助于使该网站成为一个良好的知识库:-)
Graza 2012年

Answers:


392

使用xattr命令。您可以检查扩展属性:

$ xattr s.7z
com.apple.metadata:kMDItemWhereFroms
com.apple.quarantine

并使用该-d选项删除一个扩展属性:

$ xattr -d com.apple.quarantine s.7z
$ xattr s.7z
com.apple.metadata:kMDItemWhereFroms

您还可以使用该-c选项删除所有扩展属性:

$ xattr -c s.7z
$ xattr s.7z

xattr -h将显示命令行选项,并且xattr有一个手册页


2
苹果已经为它提供一个男人页面在线:developer.apple.com/documentation/Darwin/Reference/ManPages/...
奎因·泰勒

看来-c选项已在Mountain Lion(10.8)中删除。xattr -h不再列出-c并在使用时产生“ -c无法识别”。现在非常痛苦地一一删除扩展属性。
helioz

1
-c对我不起作用(OS X 10.6.8)。-d虽然没有抱怨,但也没有任何效果。我必须像这样显式地命名每个扩展属性:(xattr -rd <attrname> <folder/file>递归删除)。要找出存在的属性(可能与整个目录树中的属性相同),请使用xattr <dir/file>上面的答案。
mindthief

@mindtheif这里没有人提到这需要xCode命令行工具。在10.6.8上,它被称为不同的东西。这是 GitHub上预安装程序的链接,因此您无需安装所有xCode即可查看这是否是您的问题。

5
在我的10.8.5系统上安装了Xcode后,对我来说xattr -c效果很好(并成功剥离了所有元数据)。
Doktor J

103

删除单个文件上的单个属性

请参阅Bavarious的答案。


删除单个文件上的所有扩展属性

xattr-c标志一起使用以“清除”属性:

xattr -c yourfile.txt



删除许多文件上的所有扩展属性

要以递归方式删除目录中所有文件的扩展属性,请将-c“ clear”标志与-r递归标志结合使用:

xattr -rc /path/to/directory



Mac OS X用户的提示

路径是否有空格或特殊字符?

打开Terminal.app并开始键入xattr -rc,在其末尾添加一个空格,然后将文件或文件夹拖到Terminal.app窗口中,它将自动添加完整路径并带有适当的转义。


1
-c失败的OS X 10.5: option -c not recognized。我们使用一个在Apple的PowerPC上进行测试。它看起来像OS X支持的下级版本-l-p-w-d
jww

@cwd:Finder中拖动正落入终端不工作与某些“特殊”搜索作为文件,例如. textClipping如描述apple.stackexchange.com/questions/301871/...
ccpizza

@jww我在下面的答案中解释了为什么会出现错误。stackoverflow.com/a/58616002/1896134
JayRizzo

23

尝试使用:

xattr -rd com.apple.quarantine directoryname

这需要在所有位置以递归方式删除讨厌的属性。


7

另一种递归方法:

# change directory to target folder:
cd /Volumes/path/to/folder

# find all things of type "f" (file), 
# then pipe "|" each result as an argument (xargs -0) 
# to the "xattr -c" command:
find . -type f -print0 | xargs -0 xattr -c

# Sometimes you may have to use a star * instead of the dot.
# The dot just means "here" (whereever your cd'd to
find * -type f -print0 | xargs -0 xattr -c

-c失败的OS X 10.5: option -c not recognized。我们使用一个在Apple的PowerPC上进行测试。它看起来像OS X支持的下级版本-l-p-w-d
jww

@jww我在下面的答案中解释了为什么会出现错误。stackoverflow.com/a/58616002/1896134
JayRizzo

3

答案(个人文件)


1.展示要在选择中使用的键。

xattr ~/Desktop/screenshot\ 2019-10-23\ at\ 010212.png
    # com.apple.FinderInfo
    # com.apple.lastuseddate#PS
    # com.apple.metadata:kMDItemIsScreenCapture
    # com.apple.metadata:kMDItemScreenCaptureGlobalRect
    # com.apple.metadata:kMDItemScreenCaptureType

2.选择一个要删除的密钥。

xattr -d com.apple.lastuseddate#PS ~/Desktop/screenshot\ 2019-10-23\ at\ 010212.png
xattr -d kMDItemIsScreenCapture ~/Desktop/screenshot\ 2019-10-23\ at\ 010212.png

3.再次展示密钥以查看它们已被删除。

xattr -l ~/Desktop/screenshot\ 2019-10-23\ at\ 010212.png
    # com.apple.FinderInfo
    # com.apple.metadata:kMDItemScreenCaptureGlobalRect
    # com.apple.metadata:kMDItemScreenCaptureType

4.最后,删除特定文件的所有键

xattr -c ~/Desktop/screenshot\ 2019-10-23\ at\ 010212.png

答案(目录中的所有文件)


1.展示要在选择中使用的键。

xattr -r ~/Desktop

2.删除目录中每个文件的特定密钥

xattr -rd com.apple.FinderInfo ~/Desktop

3.删除目录中每个文件上的所有键

xattr -rc ~/Desktop

警告:删除这些内容后,您将不会再将它们找回来!
故障错误:没有撤消。


失误


我想解决该错误的人正在得到。 因为错误也使我发疯... 在Mac上,如果您xattr以python 安装,则您的环境可能有问题。

我的Mac上有两个不同的路径 xattr

type -a xattr

    # xattr is /usr/local/bin/xattr    # PYTHON Installed Version
    # xattr is /usr/bin/xattr          # Mac OSX Installed Version

因此,在示例之一中,-c在xargs中不起作用的原因是,在bash中,您默认使用非python版本。

适用于 -c

/usr/bin/xattr -c

不适用于 -c

/usr/local/bin/xattr -c
    # option -c not recognized

我的Shell /终端默认为/ usr / local / bin / xattr,因为我相信$PATH /usr/local/bin:之前/usr/bin:是默认的。

我可以证明这一点,因为,如果您尝试卸载python xattr,则会看到:

pip3 uninstall xattr
Uninstalling xattr-0.9.6:
  Would remove:
    /usr/local/bin/xattr
    /usr/local/lib/python3.7/site-packages/xattr-0.9.6.dist-info/*
    /usr/local/lib/python3.7/site-packages/xattr/*
Proceed (y/n)?

解决方法


解决option -c not recognized错误。

  1. 卸载xattr您可能拥有的所有Python :pip3 uninstall xattr
  2. 关闭所有Terminal窗口并退出Terminal
  3. 重新打开一个新Terminal窗口。
  4. 重新运行xattr命令,它现在应该可以工作了。

要么

如果您想保留Python,请xattr使用

/usr/bin/xattr

对于中的任何Shell命令Terminal


例:


Python的版本xattr根本不处理图像:

Good-Mac:~ JayRizzo$ xattr ~/Desktop/screenshot\ 2019-10-23\ at\ 010212.png
    # com.apple.FinderInfo
    # Traceback (most recent call last):
    #   File "/usr/local/bin/xattr", line 8, in <module>
    #     sys.exit(main())
    #   File "/usr/local/lib/python3.7/site-packages/xattr/tool.py", line 196, in main
    #     attr_value = attr_value.decode('utf-8')
    # UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 2: invalid start byte

Good-Mac:~ JayRizzo$ /usr/bin/xattr ~/Desktop/screenshot\ 2019-10-23\ at\ 010212.png
    # com.apple.FinderInfo
    # com.apple.lastuseddate#PS
    # com.apple.metadata:kMDItemIsScreenCapture
    # com.apple.metadata:kMDItemScreenCaptureGlobalRect
    # com.apple.metadata:kMDItemScreenCaptureType

手册页

OSX xattr的手册页

Python xattr版本0.6.4的手册页

注:我无法找到Python的帮助页面当前版本0.9.6

谢谢阅读!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.