Как удалить «расширенные атрибуты» в файле в Mac OS X?

261

у меня есть скрипт AppleScript, который запускает стресс-тест. Частью теста является открытие, сохранение и закрытие определенных файлов. Каким-то образом файлы подобрали некоторые «расширенные атрибуты», которые запрещают сохранение файлов. Это приводит к провалу стресс-теста.

Как удалить расширенные атрибуты?

приручает
источник
Расширенные атрибуты не могут помешать сохранению файла. Вы уверены, что это не проблема с разрешениями или ACL?
Лили Баллард
Вы только что обновились до 10.7.3? Кажется, есть ошибка, из-за которой многие приложения с графическим интерфейсом (включая TextEdit, но также и другие приложения, в том числе одно, которое я написал сам, ничего странного не делает) теперь устанавливают бит карантина для файлов. Как сказал @Bavarious, вы можете удалить его, используя @ xattr @. Посмотрите на TextWrangler, который является бесплатным, и я думаю, что имеет хорошую поддержку AppleScript. Мне сказали, что это не устанавливает бит карантина.
Абхи Беккерт
6
Если приведенное ниже сработало, вы должны принять ответ - это поможет сделать этот сайт хорошей базой знаний :-)
Граза

Ответы:

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
У Apple есть справочная страница для нее, доступная онлайн: developer.apple.com/documentation/Darwin/Reference/ManPages/…
Куинн Тейлор,
Похоже, что опция -c была удалена в Mountain Lion (10.8). xattr -h больше не выводит список -c и выдает "-c not распознанный" при использовании. Очень больно теперь удалять по одному расширенные атрибуты.
Гелиоз
1
-cу меня не работает (OS X 10.6.8). -dтакже не имел никакого эффекта, хотя и не жаловался. Мне пришлось явно назвать каждый расширенный атрибут следующим образом: xattr -rd <attrname> <folder/file>(рекурсивно удаляет). Чтобы узнать присутствующие атрибуты (вероятно, те же атрибуты во всем дереве каталогов), используйте xattr <dir/file>как в ответе выше.
вор
@mindtheif здесь никто не упомянул, что для этого нужны инструменты командной строки xCode. На 10.6.8 это называется чем-то другим. Вот ссылка на предварительно собранный установщик на GitHub, так что вам не нужно устанавливать весь xCode, чтобы увидеть, является ли это вашей проблемой.
5
С Xcode, установленным в моей системе 10.8.5, он xattr -cработает нормально для меня (и успешно удаляет все метаданные).
Доктор Дж
103

Удаление одного атрибута в одном файле

Смотрите ответ Бавариуса.


Чтобы удалить все расширенные атрибуты в одном файле

Используйте 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.
июня
@cwd: перетаскивание Finder в терминал не работает с некоторыми «специальными» файлами Finder, например, . textClippingкак описано в apple.stackexchange.com/questions/301871/…
ccpizza,
@jww Я объясняю, почему вы получаете ошибку в моем ответе ниже. stackoverflow.com/a/58616002/1896134
JayRizzo
23

Попробуйте использовать:

xattr -rd com.apple.quarantine directoryname

Это заботится о рекурсивном удалении противного атрибута везде.

Venkat
источник
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 Я объясняю, почему вы получаете ошибку в моем ответе ниже. stackoverflow.com/a/58616002/1896134
JayRizzo
4

Ответ (отдельные файлы)


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

Моя оболочка / терминал по умолчанию имеет значение / usr / local / bin / xattr, потому что my $PATH /usr/local/bin:- это значение, /usr/bin:которое, по-моему, является значением по умолчанию.

Я могу доказать это, потому что, если вы попытаетесь удалить питона, 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вас может быть: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

Man Pages

MAN PAGE для OSX xattr

MAN PAGE для Python xattr ВЕРСИЯ 0.6.4

ПРИМЕЧАНИЕ: я не смог найти страницу помощи python для текущей версии 0.9.6

Спасибо за прочтение!

JayRizzo
источник