Як видалити "розширені атрибути" з файлу в Mac OS X?


260

У мене є сценарій 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 був видалений у Гірському Леві (10.8). xattr -h більше не перелічує -c і створює "-c не розпізнається" при використанні. Зараз дуже боляче видаляти розширені атрибути по одному.
геліоз

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
З Xcode, встановленим у моїй системі 10.8.5, xattr -cпрацює для мене чудово (і успішно позбавив усіх метаданих).
Doktor J

103

Видалення єдиного атрибуту в одному файлі

Дивіться відповідь Бавариуса.


Щоб видалити всі розширені атрибути в одному файлі

Використовуйте xattrз-c прапором «очистити» атрибути:

xattr -c yourfile.txt



Щоб видалити всі розширені атрибути з багатьох файлів

Щоб рекурсивно видалити розширені атрибути з усіх файлів у каталозі, комбінуйте -c"очистити" прапор із -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. Ми використовуємо його для тестування на PowerPC від Apple. Схоже , що версія нижнього рівня в OS X підтримок -l, -p, -wі -d.
jww

@cwd: перетягування Finder в термінал не працює з деякими "спеціальними" файлами 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. Ми використовуємо його для тестування на PowerPC від Apple. Схоже , що версія нижнього рівня в 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 / 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вас може бути:pip3 uninstall xattr
  2. Закрийте всі Terminalвікна та вийдітьTerminal
  3. Повторно відкрийте нове Terminal вікно.
  4. xattrКоманда ReRun і тепер має працювати.

АБО

Якщо ви хочете зберегти 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 для OSX xattr

Сторінка MAN для Python xattr VERSION 0.6.4

ПРИМІТКА. Не вдалося знайти сторінку допомоги python для поточної VERSION 0.9.6

Дякуємо за читання!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.