IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Effacement de tous les "tags" d'un volume
Options
Fraido
posté 8 Feb 2017, 20:56
Message #1


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Bonjour à tous,

Je m'évertue depuis des heures à trouver le moyen d'effacer tous les "tags" d'un volume (via Xcode ou terminal).
En utilisant la commande :

xattr -rd 'com.apple.metadata:_kMDItemUserTags ==*’ /Volumes/"Nom du Volume"/*

Tous les champs "metadata" sont bien effacés des attributs mais la pastille de couleur persiste sur chaque élément et le nom du "tag" est remplacé par le nom de la couleur. Or, j'aimerai que plus aucun "tag" ou pastille de couleur n'apparaisse. J'ai relancé la commande mais sans que cela ne change quoi que ce soit.

Quelqu'un pourrait-il m'aider?

D'avance merci.

Imac 2013 - Mac OS 10.12.2 (Sierra)
Go to the top of the page
 
+Quote Post
yponomeute
posté 9 Feb 2017, 08:32
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 969
Inscrit : 26 Jan 2011
Lieu : Pollachius virens
Membre no 164 083



Les tag couleurs sont sans doute dans le xattr com.apple.FinderInfo

Ce message a été modifié par yponomeute - 9 Feb 2017, 08:34.


--------------------
MBP 2017 15" avec clavier pourri et touchbar inutile
Go to the top of the page
 
+Quote Post
teddy7545
posté 10 Feb 2017, 20:39
Message #3


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Bonsoir

De la même façon que tu as utilisé
Code
xattr -dr com.apple.metadata:_kMDItemUserTags ~/folder

tu peux utiliser la commande suivante pour les tag couleur
Code
xattr -dr com.apple.FinderInfo ~/folder

ou encore pour effacer directement tous les attributs étendus :
Code
xattr -cr ~/folder.

Tu peux également utiliser -xattrname ou mdfind pour rechercher les tags sélectivement :

find ~/folder -xattrname com.apple.metadata:_kMDItemUserTags
mdfind -onlyin ~/folder kMDItemUserTags=\*

Dans le terminal :
Code
man xattr
est ton ami wink.gif

Ce message a été modifié par teddy7545 - 10 Feb 2017, 20:42.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Fraido
posté 12 Feb 2017, 22:46
Message #4


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Merci beaucoup pour toutes ces informations.

J'ai cependant oublié de préciser que je tenais absolument à préserver les icônes des répertoires qui verront leurs pastilles effacées, ce qui n'est pas possible via l'effacement des metadata liée à com.apple.FinderInfo.
C'est bien là que "man" blèse. Il y a deux exemples fournis avec la documentation de la commande xattr, et aucun moyen de savoir comment exclure précisément certaines données, ou comment effacer précisément une partie des données,...
J'en suis à me dire qu'il me faudra copier les icônes dans un répertoire temporaire et les remettre en place après l'exécution de la commande xattr. Ce n'est la pas meilleur manière d'éviter des problèmes de permission et autres.
Pourquoi diable Apple a-t-il mis le nom de la pastille dans une section et sa couleur dans une autre? N'y a-t-il aucun moyen d'effacer uniquement les informations liées à la couleur de la pastille dans com.apple.FinderInfo?

D'avance merci.

Go to the top of the page
 
+Quote Post
Fraido
posté 12 Feb 2017, 23:01
Message #5


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Voici, un exemple qui montre la différence entre le contenu de com.apple.FinderInfo d'un répertoire ayant une icône(exemple 1) et le même lorsque qu'on y rajoute un tag(exemple 2).

1)
com.apple.FinderInfo:
00000000 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020

2)
com.apple.FinderInfo:
00000000 00 00 00 00 00 00 00 00 04 0C 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020


Il suffirait de remettre le dixième champs à "00" pour que la pastille disparaisse, mais, est-ce possible?

Ce message a été modifié par Fraido - 12 Feb 2017, 23:02.
Go to the top of the page
 
+Quote Post
Fraido
posté 12 Feb 2017, 23:53
Message #6


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



J'ai beau chercher, je ne vois pas comment atteindre le contenu de com.apple.FindeInfo.
Ni via Python, ni via le Shell. Peut-être via egrep et sed? Mais là, je crois que je rêve.
J'ai beau ne pas être en voiture, je trouve que ça sent le sapin,... :-)

Ce message a été modifié par Fraido - 13 Feb 2017, 00:15.
Go to the top of the page
 
+Quote Post
Fraido
posté 13 Feb 2017, 00:46
Message #7


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



La commande suivante permet d'isoler le dixième champ de com.apple.FinderInfo

xattr -l com.apple.FinderInfo /Volumes/.../dossier\ sans\ titre/ | grep "00000000" | awk -F " " {'print $11}'

Réponse = "0C"

Mais la commande xargs ne permet pas de le modifier.
J'ai essayé :

xattr -l com.apple.FinderInfo /Volumes/.../dossier\ sans\ titre/ | grep "00000000" | awk -F " " {'print $11}' | xargs -0 sed -i '' -e 's|0C|00|g'

Réponse = "xattr: No such file: com.apple.FinderInfo - sed: 0C : No such file or directory"

La première erreur est inconsistante, mais la deuxième nous dit que sed espère recevoir un répertoire ou fichier en entrée. Comment appliquer le changement au contenu? Tel est ma question.

Merci pour l'attention que vous manifestez à l'égard de ma demande.
Go to the top of the page
 
+Quote Post
teddy7545
posté 13 Feb 2017, 01:11
Message #8


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Bonsoir

Pour lire et modifier le caractère fixe tu peux utiliser cette commande qui te donne la nouvelle chaine à utiliser :

Code
echo $(xattr -px com.apple.FinderInfo AAAAAAAA.txt) | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/"


Pour écrire les attribut tu peux utiliser cette commande.

Code
xattr -wx com.apple.FinderInfo "0000000000000000000E00000000000000000000000000000000000000000000" AAAAAAAA.txt


et si je mélange ces deux commandes on peut faire ça :

Code
xattr -wx com.apple.FinderInfo "$(echo $(xattr -px com.apple.FinderInfo AAAAAAAA.txt) | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/")" AAAAAAAA.txt


Ensuite, si tu souhaites appliquer cette commande à un répertoire il faut faire quelque chose du genre :

Code
for i in ~/Desktop/AAAAAAA/*; do xattr -wx com.apple.FinderInfo "$(echo $(xattr -px com.apple.FinderInfo "$i") | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/")" "$i"; done


Ou encore en utilisant une commande find pour cibler une liste de fichier avec des critères particuliers:

Code
liste=$(find ~/Desktop/AAAAAAA/ -iname '*.txt'); for i in $liste; do xattr -wx com.apple.FinderInfo "$(echo $(xattr -px com.apple.FinderInfo "$i") | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/")" "$i"; done


Ce message a été modifié par teddy7545 - 13 Feb 2017, 02:02.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Fraido
posté 13 Feb 2017, 01:42
Message #9


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Je viens de trouver une réponse similaire.

Dans un premier temps :

Code
xattr -rd com.apple.metadata:_kMDItemUserTags /Volumes/.../dossier\ sans\ titre/


Et ensuite :

Code
xattr -wx com.apple.FinderInfo 0000000000000000040000000000000000000000000000000000000000000000 /Volumes/.../dossier\ sans\ titre/


Je constate que pour garder l'icône tu utilises "0E" à la place de "04", quelle différence y-a-t-il?

Comme il s'agit de placer le tout dans une application Swift, je vais plutôt opter pour ma solution. Ceci dit, merci beaucoup pour ton aide d'une grande efficacité.

Ce message a été modifié par Fraido - 13 Feb 2017, 01:44.
Go to the top of the page
 
+Quote Post
teddy7545
posté 13 Feb 2017, 02:14
Message #10


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Bonsoir,


Pas de soucis… utilise la méthode qui te semble la meilleure…
En effet comme tu n'avais pas mentionné Swift ou ObjectiveC je me suis cantonné à te répondre en commande Shell

Pour le 0E il n'y a pas de raison .. juste que c'est ce qu'il y avait dans mon fichier quand je l'ai copié.
Cette ligne était juste là a titre d'exemple pour montrer qu'on pouvais écrire les attributs en hexa.

Le principe de la suite étant de lire les données com.apple.FinderInfo puis de les réécrire en ayant écrit 0 dans les 4 derniers bits du dixième octet.

Je vois toutefois une différence entre ta commande et la mienne….
Tu sembles écrire sur tous les fichier de ton répertoire les même data.
C'est peut être ce que tu souhaites faire, mais cela sous entend qu'il y a aucune différence entre les attributs de chaque fichier.

De mon côté pour chaque fichier je vais écraser uniquement le code de la couleur et remettre toutes les autres valeurs en place.
S'il y a un fichier qui contient un attribut différent il sera donc conservé.

Ce message a été modifié par teddy7545 - 13 Feb 2017, 02:16.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Fraido
posté 13 Feb 2017, 15:57
Message #11


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Oui, effectivement, ta solution est plus efficace que la mienne. Mais, elle fait appel à des connaissances que je n'ai pas.
J'aimerai bien l'implanter dans mon application mais je voudrais la comprendre avant.

Par exemple que font les flags "p" et "x" dans la commande xattr? Je ne trouve pas d'informations à ce sujet.
Code
xattr -px com.apple.FinderInfo


Concernant la commande "sed" :
Code
sed -e "s/ //g"

S'agit-il ici d'enlever les espaces présent dans FInderInfo?

Code
sed -E "s/^(.{19})./\10/")"

Celle-ci, je ne la comprends pas (mais j'aimerai bien). Je suppose que c'est la commande qui modifie le contenu de FinderInfo mais je ne comprends pas sa syntaxe (dans l'ensemble). Pourrais-tu me la détailler?
Merci beaucoup.

Ce message a été modifié par Fraido - 13 Feb 2017, 15:58.
Go to the top of the page
 
+Quote Post
hellomorld
posté 13 Feb 2017, 16:41
Message #12


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 148
Inscrit : 31 Oct 2003
Membre no 11 118



Et simplement afficher tous les fichiers/dossiers taggués (en cliquant sur le tag correspondant de la barre latérale du finder) puis les détagguer depuis le finder ?
Pas besoin de sortir le terminal pour ça d'autant qu'il ne devrait pas y tant de tags différents que ça non ?


--------------------
Go to the top of the page
 
+Quote Post
Fraido
posté 13 Feb 2017, 17:26
Message #13


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Citation (hellomorld @ 13 Feb 2017, 16:41) *
Et simplement afficher tous les fichiers/dossiers taggués (en cliquant sur le tag correspondant de la barre latérale du finder) puis les détagguer depuis le finder ?
Pas besoin de sortir le terminal pour ça d'autant qu'il ne devrait pas y tant de tags différents que ça non ?


Je souhaite que cela soit fait automatiquement lors du lancement de l'application (rsync basé sur des tags), afin d'éviter de devoir le faire manuellement. ;-)
Go to the top of the page
 
+Quote Post
teddy7545
posté 13 Feb 2017, 17:40
Message #14


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Bonjour,

Citation
Par exemple que font les flags "p" et "x" dans la commande xattr? Je ne trouve pas d'informations à ce sujet.
xattr -px com.apple.FinderInfo
Pour la première ligne la réponse est dans le man : mais en version courte ça donne -p =print ; -x=hexa

Citation
Concernant la commande "sed" :
sed -e "s/ //g"
S'agit-il ici d'enlever les espaces présent dans FInderInfo?
Oui simplement pour avoir une chaine de retour sans espace.
La commande xattr renvoit par défaut l'hexa par groupe de 2 caractère (un octets).
L'exemple que j'avais sous la main d'écriture montrait tous les caractères jointifs.
J'ai pas pris le temps de tester si ça fonctionne sans car c'était plus simple et rapide pour moi d'ajouter ça (mais c'est peut être pas utile). tongue.gif
Ca simplifiait aussi le comptage pour la commande suivante

Citation
sed -E "s/^(.{19})./\10/"
Celle-ci, je ne la comprends pas (mais j'aimerai bien). Je suppose que c'est la commande qui modifie le contenu de FinderInfo mais je ne comprends pas sa syntaxe (dans l'ensemble). Pourrais-tu me la détailler?
Pour cette dernière c'est un tout petit peu plus compliqué:
^ représente le début d'une ligne
{19} représente 19 fois le caractère qui le précède
. à la valeur d'un caractère quelquonque.
( ) sert à capter la chaine qui se trouve à l'intérieur (pour la réutiliser ultérieurement)

^(.{19}). représente donc les 19 premiers caractères de la chaine à partir du début (capté pour être réutilisés tel quel ---> c'est la partie inchangée) puis le point juste derrière qui représente le caractère qui ne sera pas gardé et qui devra donc être remplacé (c'est le 20ème caractère qu'il faut rempalcer --> j'aurais surement du/pu remplacer les 19 et 20 ème pour l'hexa)
Je coupe cette partie de chaine

Dans la seconde partie tu vois \10 mais c'est \1 et 0 qu'il faut comprendre
\1 repésente la première chaine captée (il n'y en a qu'une ici mais on peut en utiliser plusieures)
0 représente le 20eme caractère que je rajoute (forçé à 0)
Je substitue par cette nouvelle chaine

En résumé, je prépare la substitution des 20 premiers caractères :
Je coupe les 20 première caractères en ne "captant" que les 19 premiers.
Je réutilise cette chaine de 19 caractères à laquelle j'ajoute à la fin un caractère 0 (le 20ème que je remplace).
Le reste de la chaine n'est donc pas modifié.

cool.gif

Ce message a été modifié par teddy7545 - 13 Feb 2017, 18:51.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Fraido
posté 13 Feb 2017, 19:51
Message #15


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Etrange, je n'ai pas vu de détail concernant le flag "-p" dans les man de xattr.

Citation
Pour cette dernière c'est un tout petit peu plus compliqué:
^ représente le début d'une ligne
{19} représente 19 fois le caractère qui le précède
. à la valeur d'un caractère quelquonque.
( ) sert à capter la chaine qui se trouve à l'intérieur (pour la réutiliser ultérieurement)

^(.{19}). représente donc les 19 premiers caractères de la chaine à partir du début (capté pour être réutilisés tel quel ---> c'est la partie inchangée) puis le point juste derrière qui représente le caractère qui ne sera pas gardé et qui devra donc être remplacé (c'est le 20ème caractère qu'il faut rempalcer --> j'aurais surement du/pu remplacer les 19 et 20 ème pour l'hexa)
Je coupe cette partie de chaine

Dans la seconde partie tu vois \10 mais c'est \1 et 0 qu'il faut comprendre
\1 repésente la première chaine captée (il n'y en a qu'une ici mais on peut en utiliser plusieures)
0 représente le 20eme caractère que je rajoute (forçé à 0)
Je substitue par cette nouvelle chaine

En résumé, je prépare la substitution des 20 premiers caractères :
Je coupe les 20 première caractères en ne "captant" que les 19 premiers.
Je réutilise cette chaine de 19 caractères à laquelle j'ajoute à la fin un caractère 0 (le 20ème que je remplace).
Le reste de la chaine n'est donc pas modifié.


Merci pour ces détails bien utiles.

En testant ces commandes j'obtient une erreur :

Code
xattr -px com.apple.FinderInfo /Volumes/.../test | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/")"
-bash: syntax error near unexpected token `)'


Quelque chose cloche après le deuxième pipe. As-tu une idée de ce que cela peut-être?
Go to the top of the page
 
+Quote Post
teddy7545
posté 13 Feb 2017, 22:08
Message #16


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Deux petits soucis :

1/Dans la commande que tu as essayé il y a un déséquilibre de guillemets et de parenthèse (ceux de la fin n'ont pas de paires)

xattr -px com.apple.FinderInfo /Volumes/.../test | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/")"

2/Pour la commande :
Code
      xattr -px com.apple.FinderInfo AAAA.txt

Le résultat est de la forme suivante (c'est à dire sur deux lignes) :

00 00 00 00 00 00 00 00 00 0F 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Or la commande Sed qui va suivre ensuite traite chaque ligne (donc risque d'ajouter deux fois les caractères)

Pour palier a ce problème j'utilise un artifice avec écho :
echo $(xattr -px com.apple.FinderInfo AAAA.txt)
qui donne un résultat de la forme suivante (une seule ligne)

00 00 00 00 00 00 00 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Ensuite les deux commandes Sed font leur travaille.

La commande corrigée donne donc :
Code
      echo $(xattr -px com.apple.FinderInfo AAAA.txt) | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/"

Cette ligne lit et montre la chaine modifiée dans le terminal mais ne modifie pas encore les attributs dans le fichier.

Pour modifier les attributs d'un fichier, il faudra donc utiliser la forme : (chaque parenthèse et guillement devant être correctement positionné)

xattr -wx com.apple.FinderInfo "$(echo $(xattr -px com.apple.FinderInfo AAAA.txt) | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/")" AAAA.txt

Voir les deux dernières formes dans mon message d'hier pour traiter des répertoires ou des listes de fichiers.

Edit:mise en couleur des différentes parties de la commande finale pour mieux les distinguer

Ce message a été modifié par teddy7545 - 14 Feb 2017, 18:25.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Fraido
posté 14 Feb 2017, 02:03
Message #17


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Bien reçu, merci.

J'ai maintenant pu tester la commande avec succès. C'est d'une efficacité remarquable.

J'aimerai en savoir plus sur l'action de chaque section de FinderInfo. Il y en a une qui permet de définir l'existence d'une icône, l'autre d'un tag, que font les sections restantes? Est-il possible de le savoir?
Go to the top of the page
 
+Quote Post
Fraido
posté 16 Feb 2017, 21:52
Message #18


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Je reviens vers vous concernant l'effacement des pastilles (tags).

Lors de l'effacement des pastilles d'un volume (commande xattr), le disque en question s'active pendant quelques minutes (parfois 15 minutes).
Il semblerait que le processus en question soit "mds_stores" (activité en lien avec Spotlight, 3 Gb d'écrit aujourd'hui). Ce qui me fait dire que Spotlight fait une mise à jour complète des metadatas du disque après chaque lancement de la commande xattr (que quelque chose soit copié ou non) VIA UN PLAYGROUND XCODE.
Les divers articles que j'ai lu, ou les man page de "mdutil" ne me permettent pas de comprendre comment éviter l'indexation de tout le disque, de la limiter aux éléments modifiés.
Via un arrêt temporaire (mdutil -i)? Via mdimport? Quelqu'un aurait-il une idée? Serait-ce lié à Xcode seulement?

Merci.

Ce message a été modifié par Fraido - 17 Feb 2017, 00:48.
Go to the top of the page
 
+Quote Post
Fraido
posté 18 Feb 2017, 02:19
Message #19


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Voilà le résultat que j'obtiens lorsque je tente de faire avaler à Swift la commande "sed" contenant un caractère d'échappement.

Code
sed -E "s/^(.{19})./\10/")" AAAAAAAA.txt


Avec Swift, cela donne

Code
let test = "s/^(.{19})./"+"\10/")"


Et la réponse est :
Consecutive statements on a line must be separated by ';'
Invalid escape sequence in literal

Y a-t-il moyen de résoudre ce problème? Je sais que pour une commande "-exec" Swift accepte le ";" à la place du caractère d'échappement mais dans le cas présent, je ne vois pas comment faire.

Ce message a été modifié par Fraido - 18 Feb 2017, 02:32.
Go to the top of the page
 
+Quote Post
teddy7545
posté 18 Feb 2017, 15:49
Message #20


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Je ne comprend pas ce que tu souhaites faire avec la chaine dans Swift ?
Utiliser les regex avec Swift ou alors appeler le terminal pour exécuter sed ?

Je ne comprend pas non plus pourquoi tu coupes la chaine en deux
De plus les deux dernier caractères n'appartiennent pas à la commande Sed (regarde les couleurs dans un de mes message précédent)

Enfin pour le utiliser le caractère backslash dans une chaine Swift tu dois le doubler

Si j'enlève les deux derniers caractère et que je double le backslash la chaine devient alors valide

Code
let test = "s/^(.{19})./\\10/"

Est-ce que c'est ce que tu voulais faire ?

Ce message a été modifié par teddy7545 - 18 Feb 2017, 16:03.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Fraido
posté 18 Feb 2017, 19:00
Message #21


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Bonsoir Teddy,

Encore un grand merci pour la qualité et la rapidité de ton aide. Tu as exactement répondu à ma question.

L'exemple que j'ai donné (let test...) est utilisé uniquement afin de focaliser sur le problème (qui était de transcrire correctement la commande "xattr -wx..." du Shell vers Swift).
Le reste de la commande n'a pas posé de problème particulier au niveau de la syntaxe.
Je publierai l'ensemble de la commande traduite en Swift une fois que j'aurai testé le tout.
Go to the top of the page
 
+Quote Post
Jaypee
posté 19 Feb 2017, 15:03
Message #22


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



J'ai trouvé ceci : http://nshipster.com/extended-file-attributes/

qui fait référence à cet include: /usr/include/sys/xattr.h qui contient entre autres les prototypes de l'API pour les xattr:

int setxattr(const char *path, const char *name, const void *value, size_t size, u_int32_t position, int options);

int fsetxattr(int fd, const char *name, const void *value, size_t size, u_int32_t position, int options);

int removexattr(const char *path, const char *name, int options);

int fremovexattr(int fd, const char *name, int options);

@Teddy7545, man "paste" contient des infos pour éviter le fichier intermédiaire.
@+
J-P
Go to the top of the page
 
+Quote Post
Fraido
posté 20 Feb 2017, 02:22
Message #23


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



J'ai essayé de diverses manières d'implémenter dans un Playground Swift la commande suivante :
Code
xattr -wx com.apple.FinderInfo "$(echo $(xattr -px com.apple.FinderInfo AAAAAAAA.txt) | sed -e "s/ //g" | sed -E "s/^(.{19})./\10/")" AAAAAAAA.txt

Mais je n'y suis pas arrivé, même si j'ai appris beaucoup de choses au passage.

J'ai néanmoins utilisé l'esprit de tes commandes Shell pour réécrire le tout en Swift.
Non seulement le script tourne à merveille mais en plus il ne génère pas les problèmes rencontrés précédemment (dossier "Icon?" qui apparaît, le disque traité qui fait une mise à jour qui dure des plombes).

Le script au format Playground se trouve en attachement. Il suffit de remplacer les parties indiqués: (<CheminVersleVolumeATraiter>) par le chemin désiré (/Volumes/...), le tout entre guillemets et sans le "/" final, pour le voir s'exécuter sous vos yeux ébahis. il est nécessaire que le volume en question soit indexé par Spotlight et que la dernière version d'Xcode soit installée.

Je ne l'ai pas encore testé sur l'ensemble d'un volume (cela peut prendre du temps, même si mdfind est très très rapide).

J'ai constaté que certains fichiers (pdf,...) gardaient parfois leur pastilles après traitement, mais sans le nom de la pastille (qui est remplacé par le nom de la couleur de la pastille). Il y a deux possibilités pour régler ce problème. Soit je relance le script soit j'applique un "xattr -c" au fichier en question. Je me tâte encore.

Je décline toute responsabilité en cas de mauvais usage du fichier attaché et je remercie quiconque utilisera ce script de bien vouloir me faire part de ses commentaires.

Fichier(s) joint(s)
Fichier joint  EffacementdesPastilles_MacBidouille.playground.zip ( 9.94 Ko ) Nombre de téléchargements : 1
 
Go to the top of the page
 
+Quote Post
Jaypee
posté 20 Feb 2017, 07:05
Message #24


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Je précise pour@Teddy7545
plutôt que la commande echo pur "sérialiser" l'affichage de xattr, la command paste permet de mettre bot à bout les deux lignes
xattr -px com.apple.FinderInfo nom_de_fichier | paste -s -

Le - final représente le flux d'entrée de la commande, c'est-à-dire la sortie en deux lignes de xattr de la commande qui précède.

@Fraido, l' API en C est intégrable plus directement à Swift

------------- Swift
-------------- shell
-------------- xattr
------------ API xattr ---
---------- Blibliothèque C ---

Au lieu de passer par l'étage "shell", puis descendre par la commande shell pour atteindre l'API, tu peux descendre directement en utilisant directement l'API en Swift.
------------- Swift
------------ API xattr ---
---------- Blibliothèque C ---

Par ailleurs, il faut une fois de plus dans ce projet (d'autre similaires ont déjà été débattus) il faut appliquer un "pattern visitor"
Une première fonction récursive de parcours de l'arborescence du volume, une deuxième de fonction "de visite" à appliquer à chaque fichier visité

@+
J-P

Ce message a été modifié par Jaypee - 20 Feb 2017, 07:16.
Go to the top of the page
 
+Quote Post
Fraido
posté 21 Feb 2017, 00:42
Message #25


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Citation
Au lieu de passer par l'étage "shell", puis descendre par la commande shell pour atteindre l'API, tu peux descendre directement en utilisant directement l'API en Swift.
------------- Swift
------------ API xattr ---
---------- Blibliothèque C ---


S'agit-il de ne plus utiliser "Process" (qui permet de lancer des script shell)? Pourrais-tu fournir un exemple? Merci.
Go to the top of the page
 
+Quote Post
Jaypee
posté 21 Feb 2017, 06:44
Message #26


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Non, il s'agit d'utiliser directement les API xattr comme des fonctions normales de Swift.

Il y a une difficulté à trouver la bonne recette, mais elle est générique, si la solution est bien comprise, elle servira à intégrer n'importe quel code C/C++ externe.

Le seul exemple, pas complet, est la page que j'ai citée plus haut, elle montre l'intégration avec Objectve-C qui est un moindre mal
En Swift, il faut changer les signatures de fonctions en utilisant les type Swift correspondants.

Quelques références utiles:
  1. http://nshipster.com/extended-file-attributes/
  2. https://developer.apple.com/library/content...gWithCAPIs.html
  3. http://stackoverflow.com/questions/3254126...546879#32546879
  4. https://www.skillshare.com/classes/How-to-U...mples/854251353

@+
JP
PS: Voici un essai dans un playground
Code
import Foundation
let path = "/path/vers/un/fichier"

// ssize_t listxattr(const char *path, char *namebuff, size_t size, int options);

var buf: [CChar] = (0..<1024).map { i in 0 } // buffer initialisé avec des caractères nuls.
let s = listxattr(path, &buf, 1024, XATTR_SHOWCOMPRESSION)
buf
String.init(cString: &buf) // "com.apple.FinderInfo"
String.init(cString: 21 + &buf) // "com.apple.metadata:_kMDItemUserTags"


Ce message a été modifié par Jaypee - 22 Feb 2017, 06:31.
Go to the top of the page
 
+Quote Post
Fraido
posté 22 Feb 2017, 20:55
Message #27


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Citation
import Foundation
let path = "/path/vers/un/fichier"

// ssize_t listxattr(const char *path, char *namebuff, size_t size, int options);

var buf: [CChar] = (0..<1024).map { i in 0 } // buffer initialisé avec des caractères nuls.
let s = listxattr(path, &buf, 1024, XATTR_SHOWCOMPRESSION)
buf
String.init(cString: &buf) // "com.apple.FinderInfo"
String.init(cString: 21 + &buf) // "com.apple.metadata:_kMDItemUserTags"


Un grand merci pour cette exemple qui jette un grand trait de lumière sur un pan de Swift que je ne connaissais pas (mais dont je subodorais l'existence).

J'étais découragé par la nécessite de passer par l'étude de scripts en C mais là je suis ravi.

Je l'ai testé dans un playground et le résultat est étonnant. En seulement quelques lignes tu arrives à déterminer l'existence ou non des metadatas com.FinderInfo et kMDItemUserTags d'un fichier (ou répertoire).

var buf: [CChar] = (0..<1024).map { i in 0 } -->> C'est formidable

Par contre, je ne comprends pas toute la syntaxe.

Je ne vois pas à quel moment la variable "let s" est prise en compte, rien ne l'indique?
Qu'en est-il du contrôle des erreurs? Si j'induis une erreur dans le chemin de fichier ("let path"), la réponse est vide : "". Est-il possible d'avoir plus d'info?
Qu'est-ce qui détermine le choix de la taille du buffer?
Les informations rapportées par le buffer sont des chiffres. A quoi correspondent-ils?
Est-il possible de lancer toutes les commandes Shell de cette manière?
La commande mise en commentaire je n'ose pas là décommenter, que fait-elle au juste?

Encore merci à toi pour ces informations qui ouvrent des perspectives très intéressantes.
Go to the top of the page
 
+Quote Post
Jaypee
posté 23 Feb 2017, 06:58
Message #28


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Le commentaire est le prototype de la fonction C originale, telle qu'elle est déclarée dans "/usr/include/sys/xattr.h"

De là, on voit que c'est une fonction, donc on récupère son résultat qui est la longueur réelle < 1024 effectivement utilisée dans buf.
Cela dit, pourquoi path (passage par valeur) et &buf, (passage par adresse) ? comment le prévoir d'après la déclaration ?

Si le style Swift "fonctionnel" te séduit, relis la discussion quasiment un monologue, que j'avais menée dans ce forum (Swift on tente ?)

@+
J-P

Ce message a été modifié par Jaypee - 23 Feb 2017, 07:00.
Go to the top of the page
 
+Quote Post
Fraido
posté 23 Feb 2017, 18:43
Message #29


Nouveau Membre


Groupe : Membres
Messages : 29
Inscrit : 7 Feb 2017
Membre no 201 136



Oui, je suis clairement intéressé d'en savoir plus. Concision et rapidité, comment résister?

Je découvre avec intérêt le forum intitulé "Swift on tente". J'en ai pour un moment avant de tout intégrer, je pêche déjà par mauvaise connaissance du vocabulaire propre à l'orienté-object.

Mais ce qui m'intéresse pour l'instant concerne l'étendue de cette syntaxe Swift "fonctionnel"(de Bas-niveau?). Est-ce aussi évolutif que le Swift de Haut niveau, la syntaxe évolue-t-elle aussi fortement (de Swift à Swift3)? Est-ce la même syntaxe entre IOS et Mac?
Est-il possible par exemple de lancer "find... -exec rm {} \;" en utilisant une syntaxe de Bas-niveau?

Merci pour toutes ces informations et désolé pour toutes ces questions.
Go to the top of the page
 
+Quote Post
Jaypee
posté 24 Feb 2017, 07:02
Message #30


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



https://developer.apple.com/reference/foundation/filemanager à éplucher tranquillement en version swift (cliquer sur swift en haut à droite)

Il existe même des API pout changer les attributs.

une ébauche de code :
Code
import Foundation

var buf: [CChar] = (0..<1024).map { i in 0 }
let fm = FileManager.default
let path = "/path/de/répertoire/"
let items = try fm.contentsOfDirectory(atPath: path)
    
for item in items {
    let xattrs = listxattr(item, &buf, 1024, XATTR_SHOWCOMPRESSION)
    print (String.init(cString: 21 + &buf))
}

J-P

Ce message a été modifié par Jaypee - 24 Feb 2017, 07:20.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 29th March 2024 - 00:37