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

我有一个AppleScript脚本,运行压力测试。测试的一部分是打开、保存和关闭某些文件。不知何故,文件获得了一些禁止保存文件的“扩展属性”。这会导致压力测试失败。

如何删除扩展属性?

247480 次浏览

使用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有一个手册页. 0将显示命令行选项。

尝试使用:

xattr -rd com.apple.quarantine directoryname

这样就可以递归地删除所有讨厌的属性。

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

请看巴伐利亚的回答。


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

使用带有-c标志的xattr来“清除”属性:

xattr -c yourfile.txt
< p > < br >

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

要递归地删除目录中所有文件的扩展属性,将-c "clear"标记与-r递归标记结合使用:

xattr -rc /path/to/directory

< br >


给Mac OS X用户的建议

有一个有空格或特殊字符的长路径?

打开Terminal.app并开始输入xattr -rc,包括一个尾随空格,然后将文件或文件夹拖到Terminal.app窗口,它将自动添加正确转义的完整路径。

另一种递归方法:

# 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

答案(个别档案)


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

Answer(一个目录中的所有文件)


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

xattr -r ~/Desktop

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

xattr -rd com.apple.FinderInfo ~/Desktop

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

xattr -rc ~/Desktop
< p > 警告:一旦你删除了这些,你就不会再得到它们了! < br > 错误错误:没有撤销。 < / >强


错误


我想解决错误的人正在得到。 因为这些错误也把我逼疯了…… 在mac上,如果你用python安装xattr,那么你的环境可能会有问题

在我的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/Terminal默认为/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. 卸载你可能拥有的任何Python xattr
  2. 关闭所有Terminal窗口&退出Terminal
  3. 重新打开一个新的Terminal窗口。
  4. 重新运行xattr命令,它现在应该工作了。

如果你想保留Python xattr,那么使用

/usr/bin/xattr

用于Terminal中的任何Shell命令


例子:


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

手册页

MAN PAGE for OSX xattr

MAN PAGE for Python xattr VERSION 0.6.4

注意:我不可能找到当前版本0.9.6的python帮助页

感谢阅读!