Comment supprimer les «attributs étendus» d'un fichier sous Mac OS X?


261

J'ai un script AppleScript qui exécute un test de résistance. Une partie du test consiste à ouvrir, enregistrer et fermer certains fichiers. D'une manière ou d'une autre, les fichiers ont récupéré certains "attributs étendus" qui interdisent l'enregistrement des fichiers. Cela provoque l'échec du test de résistance.

Comment supprimer les attributs étendus?


Les attributs étendus ne peuvent pas empêcher l'enregistrement d'un fichier. Êtes-vous sûr que ce n'est pas un problème d'autorisations ou une liste de contrôle d'accès?
Lily Ballard

Vous venez de passer à la version 10.7.3? Il semble qu'il y ait un bug où de nombreuses applications GUI (y compris TextEdit, mais aussi d'autres applications - dont une que j'ai écrite moi-même qui ne fait rien d'étrange) définissent désormais le bit de quarantaine sur les fichiers. Comme @Bavarious l'a dit, vous pouvez le supprimer en utilisant @ xattr @. Regardez dans TextWrangler, qui est gratuit, et je pense qu'il a un bon support AppleScript. On me dit que cela ne définit pas le bit de quarantaine.
Abhi Beckert

6
Si ce qui suit a fonctionné, vous devriez accepter la réponse - cela aide à faire de ce site une bonne base de connaissances :-)
Graza

Réponses:


392

Utilisez la xattrcommande. Vous pouvez inspecter les attributs étendus:

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

et utilisez l' -doption pour supprimer un attribut étendu:

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

vous pouvez également utiliser l' -coption pour supprimer tous les attributs étendus:

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

xattr -hvous montrera les options de ligne de commande, et xattr a une page de manuel .


2
Apple a une page de manuel disponible en ligne: developer.apple.com/documentation/Darwin/Reference/ManPages/…
Quinn Taylor

Il semble que l'option -c ait été supprimée dans Mountain Lion (10.8). xattr -h ne répertorie plus -c et produit "-c non reconnu" lorsqu'il est utilisé. Très douloureux maintenant pour supprimer les attributs étendus un par un.
helioz

1
-cne fonctionne pas pour moi (OS X 10.6.8). -dn'a également eu aucun effet bien qu'il ne se soit pas plaint. J'ai dû nommer explicitement chaque attribut étendu comme ceci: xattr -rd <attrname> <folder/file>(supprime récursivement). Pour connaître les attributs présents (probablement les mêmes attributs dans toute l'arborescence des répertoires), utilisez xattr <dir/file>comme dans la réponse ci-dessus.
mindthief

@mindtheif personne n'a mentionné ici que cela nécessite les outils de ligne de commande xCode. Le 10.6.8, cela s'appelle quelque chose de différent. Voici un lien vers un programme d'installation pré-construit sur GitHub afin que vous n'ayez pas à installer tout xCode pour voir si c'est votre problème.

5
Avec Xcode installé sur mon système 10.8.5, xattr -cfonctionne très bien pour moi (et a réussi à supprimer toutes les métadonnées).
Doktor J

103

Suppression d'un attribut unique sur un seul fichier

Voir la réponse de Bavarious.


Pour supprimer tous les attributs étendus d'un seul fichier

Utilisez xattravec le -cdrapeau pour "effacer" les attributs:

xattr -c yourfile.txt



Pour supprimer tous les attributs étendus de nombreux fichiers

Pour supprimer récursivement les attributs étendus de tous les fichiers d'un répertoire, combinez l' -cindicateur "clear" avec l' -rindicateur récursif:

xattr -rc /path/to/directory



Un conseil pour les utilisateurs de Mac OS X

Vous avez un long chemin avec des espaces ou des caractères spéciaux?

Ouvrez Terminal.appet commencez à taper xattr -rc, incluez un espace de fin, puis faites glisser le fichier ou le dossier vers la Terminal.appfenêtre et il ajoutera automatiquement le chemin d'accès complet avec un échappement approprié.


1
-céchoue sur OS X 10.5: option -c not recognized. Nous en utilisons un pour les tests sur le PowerPC d'Apple. Il ressemble à la version downlevel de supports OS X -l, -p, -wet -d.
Jww

@cwd: le glisser-déposer du Finder dans le terminal ne fonctionne pas avec certains fichiers du Finder «spéciaux» tels que . textClippingceux décrits dans apple.stackexchange.com/questions/301871/…
ccpizza

@jww J'explique pourquoi vous obtenez l'erreur dans ma réponse ci-dessous. stackoverflow.com/a/58616002/1896134
JayRizzo

23

Essayez d'utiliser:

xattr -rd com.apple.quarantine directoryname

Cela prend soin de supprimer récursivement l'attribut embêtant partout.


7

Une autre approche récursive:

# 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échoue sur OS X 10.5: option -c not recognized. Nous en utilisons un pour les tests sur le PowerPC d'Apple. Il ressemble à la version downlevel de supports OS X -l, -p, -wet -d.
Jww

@jww J'explique pourquoi vous obtenez l'erreur dans ma réponse ci-dessous. stackoverflow.com/a/58616002/1896134
JayRizzo

4

Réponse (fichiers individuels)


1. Présentez les clés à utiliser dans la sélection.

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. Choisissez une clé à supprimer.

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. Présentez à nouveau les clés pour voir qu'elles ont été supprimées.

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

4. Enfin, SUPPRIMER TOUTES les clés d'un fichier particulier

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

Réponse (tous les fichiers d'un répertoire)


1. Présentez les clés à utiliser dans la sélection.

xattr -r ~/Desktop

2. Supprimez une clé spécifique pour CHAQUE FICHIER dans un répertoire

xattr -rd com.apple.FinderInfo ~/Desktop

3. Supprimez TOUTES les clés de CHAQUE FICHIER d'un répertoire

xattr -rc ~/Desktop

AVERTISSEMENT: une fois que vous les supprimez, vous ne les récupérez PAS!
ERREUR DE DÉFAUT: Il n'y a PAS D'ANNULATION.


les erreurs


Je voulais corriger l'erreur que les gens obtiennent. Parce que les erreurs m'ont rendu fou aussi ... Sur un mac si vous installez xattren python, votre environnement peut avoir un problème.

Il y a deux chemins différents sur mon mac pour xattr

type -a xattr

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

Ainsi, dans l'un des exemples, où -cne fonctionnera pas dans xargs, c'est parce que dans bash, vous utilisez par défaut la version non-python.

Marche avec -c

/usr/bin/xattr -c

Ne fonctionne PAS avec -c

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

Par défaut, mon shell / terminal est / usr / local / bin / xattr car mon $PATH /usr/local/bin:est avant/usr/bin: lequel je crois que c'est la valeur par défaut.

Je peux le prouver car, si vous essayez de désinstaller le python, xattrvous verrez:

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)?

Solutions de contournement


Pour corriger les option -c not recognizederreurs.

  1. Désinstallez tout Python que xattrvous pourriez avoir:pip3 uninstall xattr
  2. Fermez toutes les Terminalfenêtres et quittezTerminal
  3. Rouvrez une nouvelle Terminalfenêtre.
  4. Exécutez à nouveau la xattrcommande et cela devrait maintenant fonctionner.

OU

Si vous souhaitez conserver le Python, xattrutilisez

/usr/bin/xattr

pour toutes les Shellcommandes dansTerminal


Exemple:


La version de Python de xattrne gère pas du tout les images:

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

Pages de manuel

PAGE DE MAN pour OSX xattr

PAGE DE MAN pour Python xattr VERSION 0.6.4

REMARQUE: je n'ai pas pu trouver la page d'aide python pour la VERSION 0.9.6 actuelle

Merci d'avoir lu!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.