Renommer le contenu de fichiers en Applescript / Automator?

Bon je crois que je vais reprendre le guide pdf de l'applescript et me faire un truc propre, car ça marche toujours pas.

Il fait bien son travail sur les fichiers qui ont déjà été ouverts, mais me demande toujours confirmation d'ouvrir les fichiers qui ne l'ont pas déjà été, puis s'arrête.

Donc je suis obligé de refaire la meme manip à chaque fois qu'il tombe sur un fichier qui n'a pas été ouvert et qu'il me demande confirmation comme là :

 
J'ai trouvé une page en anglais qui explique comment supprimer cet avertissement.

En gros, il faut attacher un script à un dossier. Il faut ensuite déposer tes fichiers dans ce dossier qui se charge de marquer les fichiers comme lus…

Le script se trouve dans le dernier paragraphe intitulé "A more elegant solution"

http://theappleblog.com/2008/03/26/disabling-launch-services-file-quarantine/

Essaye le sur quelques fichiers, si le test est concluant, nous l'intégreront au script complet…

;)
 
salut,

Il semble que le script ne marche pas. Certains de mes fichiers apparaissent comme des "scripts applications" et il les ouvre pas automatiquement.

Maintenant, j'ai aussi trouvé cette page via ton lien, que j'ai fait : j'ai ajouté ce code dans ~/Library/Preferences/com.apple.DownloadAssessment.plist
Bloc de code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>LSRiskCategorySafe</key>
<dict>
    <key>LSRiskCategoryContentTypes</key>
<array>
    <string>public.html</string>
    <string>public.php</string>
    <string>public.dmg</string>
    <string>public.doc</string>
    <string>public.docx</string>
    <string>public.jpg</string>
    <string>public.png</string>
    <string>public.zip</string>
    <string>public.rar</string>
    <string>public.script</string>
    <string>public.php-script</string>
    <string>public.app</string>
</array>
</dict>
</dict>
</plist>
mais cette méthode n'est pas concluante non plus....

peut être après un reboot? Je vais essayer et je te tiens au courant, mais j'en ai un peu marre de tourner en rond là!
 
Comment as-tu testé le script ?

As-tu bien attaché le script à un dossier ?

Oui j'ai bien attaché le script au dossier en question...
Ensuite, j'ai foutu tous mes fichiers et dossiers dans le dossier scripté et il se passe rien. et dès que je tente de rouvrir les fichiers, j'ai le pop de merde qui dit que c'est pas safe ...

EDIT: j'ai testé d'autres actions de dossiers sur d'autres dossiers et ça marche très bien... mais pas celle-ci :/
 
Effectivement, il semble que ce script ne marche qu'avec des documents TÉLÉCHARGÉS d'internet, et pas lorsqu'on les transfère d'un autre dossier, donc autant pour moi ça roule.

J'ai donc ENFIN réussi !

Mais, y'a t-il moyen, à tout hasard et pour être chiant jusqu'au bout, d'améliorer ton script pour qu'il fasse un search&replace récursif dans les sous-dossier / sous-sous-dossiers?

Merci en tous cas pour ton aide précieuse, zacromatafalgar ;)
 
J'ai donc ENFIN réussi !
:up:

Mais, y'a t-il moyen, à tout hasard et pour être chiant jusqu'au bout, d'améliorer ton script pour qu'il fasse un search&replace récursif dans les sous-dossier / sous-sous-dossiers?

Vos désirs sont des ordres… :zen:

J'ai rajouté une vérification du type de fichier afin que, si un fichier autre que html ou php se présente, il n'y ai pas d'erreur…

Bloc de code:
property textToFind : "footer"
property textToWrite : "test"
property extensionList : {"html", "php"}

on open theDrop
	set nbrItems to count of theDrop
	repeat with thisFile from 1 to nbrItems
		set theFile to (item thisFile of theDrop)
		
		set itemInfo to info for theFile
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(theFile)
		else if (alias of itemInfo is false) and (name extension of itemInfo is in extensionList) then
			processItem(theFile)
		end if
		
	end repeat
end open

-- traitement des fichiers
on processItem(thisitem)
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	close access x
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
 
J'ai rajouté la désactivation du message d'avertissement mais, pour cela, il a fallut "castrer" l'application.

En effet, il n'est plus possible de déposer des éléments sur l'icône, il faut maintenant effectuer un double-clic puis choisir un dossier…
Bloc de code:
property textToFind : "footer"
property textToWrite : "test"
property extensionList : {"html", "php"}

on run
	set theFolder to (choose folder)
	processFolder(theFolder)
end run

-- traitement des fichiers
on processItem(thisitem)
	set thisItemPos to (quoted form of POSIX path of (thisitem as alias))
	do shell script "xattr -d com.apple.quarantine " & (thisItemPos as text)
	
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	close access x (**)
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
;)
 
Trop la classe, ça marche nickel ;)

Par contre, comme je suis un imbécile de perfectionniste, je vais essayer de finaliser le truc de manière à pouvoir définir puis stocker dans une variable le texte à chercher, puis celui à remplacer avant d'ouvrir le dossier à traiter :)

Comme ça, j'aurai pas à refaire le script à chaque fois que je veux changer quelquechose de différent ...

Je peux plus te bouler c'est dommage, mais tu le mérites bien ;)
 
Par contre, comme je suis un imbécile de perfectionniste, je vais essayer de finaliser le truc de manière à pouvoir définir puis stocker dans une variable le texte à chercher, puis celui à remplacer avant d'ouvrir le dossier à traiter :)
Remplace le bloc "on run - end run" par le suivant :
Bloc de code:
on run
	set textToFind to text returned of (display dialog "Saisi le texte à rechercher : " default answer "" with icon 1)
	set textToWrite to text returned of (display dialog "Saisi le texte de remplacement : " default answer "" with icon 1)
	
	set theFolder to (choose folder)
	processFolder(theFolder)
end run
Je peux plus te bouler c'est dommage, mais tu le mérites bien ;)
Bah alors y'a plus moyen que je te ponde une ligne… :D ;)
 
Bonjour à tous,
après avoir essayé en vain de faire l'équivalent de ce script sous Automator, j'ai trouvé ce topic.

Malheureusement, je suis bloqué sur une difficulté.
Pour que ce script tourne, j'ai dû dans un premier temps enlevé la condition "xattr -d com.apple.quarantine ".
Car sur les fichiers auxquels je voulais les appliquer l'attribut xattr n'existait pas.
Je pensais qu'une fois ce problème résolu, il pourrait parcourir mes fichiers comme du texte.
Pour info, je cherche à parser des fichiers sfv créé sous XP et à remplacer un caractère spécial (à cause de l'incompatibilité des deux systèmes sur la table de codage) par un autre pris en charge par Mac OS X.
Je donne donc le caractère à remplacer, le remplaçant de ce caractère puis le dossier contenant tous les fichiers sfv.
Mais dès le premier fichier sfv rencontré, il stoppe suite à cette erreur :

line 1: syntax error near unexpected token `;'

et effectivement le fichier commence par trois lignes de commentaire (; est apparemment le tag pour les commentaires dans ce type de fichier).

Mais je ne comprends pas pourquoi ce caractère pose problème... je suis un gueux en AppleScript mais un programmeur expérimenté en Java. Je ne connais malheureusement pas le délimiteur en AppleScript mais si effectivement c'est le ";" je suis bien dans l'ennui.

Merci pour votre aide.
 
Salut l'artiste&#8230;et bienvenu sur MacGe&#8230; :)

Le delimiter par défaut est "" (entre les guillemets), pourrais-tu mettre en ligne un de ces fichiers ?

Quel caractère est à remplacer ? Par quoi ?

Si ce n'est pas confidentiel bien sûr&#8230; ;)
 
Merci pour l'accueil ! ^^
Ca fait un bail que je lis les news et j'avais toujours trouvé la réponse à mes problèmes en lisant le forum. Quand j'ai vu ce topic je me suis dit : bonne pioche.

Si je te mets le contenu du fichier ça te va ?
Bon ce que je fais, je mets le contenu texte et le fichier attaché en zip...
Bien que le fichier se comporte comme un fichier texte.

Bloc de code:
; Generated by QuickSFV v2.22 on 2004-01-02 at 15:42:02
;
;    243942814  12:10.40 2003-12-17 [ax]_ranma_&#937;_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv
[ax]_ranma_&#937;_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv E6519292
;Q2-1c4ea928b5e0f70
;Q2-oOCvh2uExQE=
;Q2-gA==

Le &#937; pose problème...
 
J'ai essayé de remplacer &#937; et pas de problème chez moi, je te joins le droplet que tu peux ouvrir en le déposant sur l'Éditeur de script pour voir le code&#8230;

Dépose un de tes fichiers, tu pourras constater que la lecture et le remplacement s'effectuent correctement, le problème survient peut être au cours de l'écriture, j'essaierais de voir ça plus tard &#8230; ;)

Bonsoir.

Finalement j'ai pris quelques minutes pour enlever le superflu du script précédent, je l'ai essayé, il fonctionne, j'ai vérifié si les fichiers étaient bien modifiés et c'est le cas&#8230; Je n'ai vérifié qu'avec 4 fichiers .sfv, enfin 1 seul mais dupliqué, après il est possible qu'un de tes fichiers pose problème&#8230;


Bloc de code:
property textToFind : "&#937;"
property textToWrite : "TEST"
property extensionList : {"html", "php", "SFV"}

on run
	set theFolder to (choose folder)
	processFolder(theFolder)
end run

-- traitement des fichiers
on processItem(thisitem)
	set fileID to open for access file (thisitem as string)
	set dataFromFile to read fileID as string
	close access fileID
	
	set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)
	
	set x to open for access file (thisitem as string) with write permission
	write dataToWrite to x
	close access x
end processItem

--traitement des dossier
on processFolder(thisFolder)
	set theseItems to list folder thisFolder without invisibles
	repeat with i from 1 to count of theseItems
		set thisitem to alias ((thisFolder as text) & (item i of theseItems))
		set itemInfo to info for thisitem
		if folder of itemInfo is true and package folder of itemInfo is false then
			processFolder(thisitem)
		else if (alias of itemInfo is false) and (the name extension of itemInfo is in extensionList) then
			processItem(thisitem)
		end if
	end repeat
end processFolder

on findReplace(theData, toFind, replaceBy)
	set text item delimiters to toFind
	set theWords to {} & text items of theData
	set theResult to 1st item of theWords
	repeat with i from 2 to (length of theWords)
		set theResult to theResult & replaceBy & (item i of theWords)
	end repeat
	return theResult
end findReplace
 
zacromatafalgar tout d'abord merci pour ton aide.
J'ai essayé le sample, à première vue ça fonctionne.
Là dessus j'ai copié collé le code de ton script corrigé.
Au premier abord il remplace bien le caractère, j'ai ouvert le fichier et j'ai remarqué quelque chose de bizarre à propos de la dernière ligne. Je me suis dit : essaye si le fichier est toujours bon...
Et ma première intuition était la bonne : un fichier sfv ne peut comporter que le nom du fichier et ensuite le CRC correspondant. Si un caractère parasite (càd non commenté apparaît) le fichier est corrompu.
J'ai fait exécuté le script sur une copie de tout mes fichiers et l'anomalie s'est produite sur les trois fichiers au hasard que j'ai ouvert.
En fait, les deux derniers caractères de la "vraie" dernière ligne sont copié pour en créer une autre... Que la dernière ligne sont commentée comme c'est le cas ici, où que ce soit un CRC ne change rien il copie les deux derniers caractères de la dernière ligne.

Ce qui donne dans mon exemple :
Bloc de code:
; Generated by QuickSFV v2.22 on 2004-01-02 at 15:42:02
;
;    243942814  12:10.40 2003-12-17 [ax]_ranma1_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv
[ax]_ranma1_-_season_05_-_08_-_me_is_kunos_daddy__me_is__atobe_dvd_rip_[e6519292].mkv E6519292
;Q2-1c4ea928b5e0f70
;Q2-oOCvh2uExQE=
;Q2-gA==
==

Les deux = sont recopiés. Imaginons que les 3 derniers commentaires et le "==" n'existaient pas, dans un autre fichier sans rien après le CRC nous aurions une ligne parasite avec "92". Les deux derniers caractères de la ligne.

J'espère que tu trouveras l'erreur et merci encore pour ton aide.
 
Bonjour,

Je ne parviens pas à reproduire l'erreur, les "==" ne sont pas rajoutés chez moi.
Il serait intéressant de savoir précisément à quel moment sont ajoutés ces caractères indésirables, pour cela je te propose de rajouter le code suivant dans la routine processItem() après la ligne set dataToWrite to findReplace(dataFromFile, textToFind, textToWrite)

Bloc de code:
set textOk to ""
	set dataToWrite to dataToWrite as string
	display dialog "datatowrite : " & dataToWrite --les "==" sont-ils déjà présent ?
       --je rajoute une boucle pour récupérer tous les caractères sauf les 2 derniers
	set nbrChar to (count of characters of (dataToWrite as string))
	repeat with i from 1 to (nbrChar - 3)
		set textOk to textOk & (character i of dataToWrite)
	end repeat
	display dialog "textok : " & textOk --les "==" sont-ils toujours là ?
       --on change également la suite pour écrire textOk dans le fichier
	set x to open for access file (thisitem as string) with write permission
	write textOk to x
	close access x
Vérifie maintenant la présence des "==" dans le fichier

Tu es sur Snow Leopard et moi sur Leopard, il faudrait qu'une autre personne sur SL teste ça afin d'être sûr que le problème ne vienne de ça.
 
Salut les petits gars,

Moi je suis sous SL, je peux tester si vous voulez... vous m'avez tellement aidé avec mes soucis de contenu de fichier que je peux bien faire pareil ;)

Faites moi juste un petit récap de ce je dois tester parce que j'ai pas trop suivi ...

:D
 
Salut les petits gars,

Moi je suis sous SL, je peux tester si vous voulez... vous m'avez tellement aidé avec mes soucis de contenu de fichier que je peux bien faire pareil ;)

Faites moi juste un petit récap de ce je dois tester parce que j'ai pas trop suivi ...

:D

Salut,

Il faut vérifier si les caractères == sont rajoutés en fin à l'écriture du fichier .SFV, pour cela je te propose de télécharger l'archive en pièce jointe.

Celle-ci contient 3 éléments :
  1. Un dossier, intitulé "LartisteTest" contenant un fichier .SFV non traité
  2. Une archive, intitulée "Lartiste_fichier_SFV_original .zip", qui contient le fichier .SFV de remplacement à déposer dans le dossier "LartisteTest"
  3. Une application applescript, intitulée "LartisteApp", à lancer par double-clic ou bien via l'Éditeur de script

* Décompresser l'archive en pièce jointe puis lancer LartisteApp, une fenêtre s'affiche dans laquelle il faut choisir le dossier LartisteTest

* Ouvrir, avec TextEdit, le fichier .SFV contenu dans LartisteTest ainsi qu'une copie du fichier .SFV original (archive "Lartiste_fichier_SFV_original .zip")

* Vérifier que le premier ne diffère du second que par deux caractères &#937; remplacés par TEST, qu'aucun caractère ne soit rajouté à la fin

Ça va aller ?

Merci :up: