Mit Applescript Begriff an Dateiname anfügen

The Dust Sailor

Mitglied
Thread Starter
Mitglied seit
23.09.2008
Beiträge
74
Hallo, ich brauche Hilfe bei einem Applescript, mit dem ich einen beliebigen Begriff an einen Dateinamen anfügen kann.

Grund: Ich versehe meine Mediendateien und manchmal auch Textdokumente mit verschiedenen Tags (Beispiel: #Original). Dazu möchte ich Skripte in der Titelleiste des Finders ablegen, durch deren Anklicken die zuvor markierten Dateien schnell und unkompliziert getagt werden.

Automatoraktionen und Programme wie A Better Finder Rename kommen dafür nicht in Frage. Das schon mal im Voraus, weil mir bestimmt dazu geraten wird.

Da ich mich nur mäßig mit Applescript auskenne (benötige es einfach zu selten), passe ich gerne vorhandene Skripte an meine Bedürfnisse an. Leider habe ich kein Skript gefunden, was diese scheinbar recht einfache Funktion so ähnlich ausführt. Es wird wohl in diesem Fall meistens auf den Automator zurück gegriffen.

Das Skript, was meinen Wünschen am nächsten kommt (von Apple), fragt allerdings auch den Begriff ab und bietet eine Auswahl, ob der Bergriff vor oder nach dem Dateinamen eingetragen werden soll. Das brauche ich alles nicht. Mein Skript sollte gleich durch anklicken den richtigen Begriff an die Datei anfügen.

Ich habe jetzt drei Stunden lang das Skript bearbeitet, aber ich erhalte immer nur Fehlermeldungen :-( Es wäre total klasse, wenn mir einer von euch auf die Sprünge helfen könnte, was ich da alles sinnvoll rauslöschen kann und wo ich meinen anzufügenden Begriff eintragen kann. Ich bin mit dem Skript absolut überfordert.

Skript
Code:
-- The following line is disabled due to a Menu Manager bug
--set the source_folder to (choose folder with prompt "Pick the folder containing the files to rename:")

try
	tell application "Finder" to set the source_folder to (folder of the front window) as alias
on error -- no open folder windows
	set the source_folder to path to desktop folder as alias
end try

set the prefix_or_suffix to ""
repeat
	display dialog "Enter the prefix or suffix to use:" default answer the prefix_or_suffix buttons {"Cancel", "Prefix", "Suffix"}
	copy the result as list to {the prefix_or_suffix, the button_pressed}
	if the prefix_or_suffix is not "" then exit repeat
end repeat
set the item_list to list folder source_folder without invisibles
set source_folder to source_folder as string
repeat with i from 1 to number of items in the item_list
	set this_item to item i of the item_list
	set this_item to (source_folder & this_item) as alias
	set this_info to info for this_item
	set the current_name to the name of this_info
	if folder of this_info is false and ¬
		alias of this_info is false then
		if the button_pressed is "Prefix" then
			set the new_file_name to the (the prefix_or_suffix & the current_name) as string
		else
			set the new_file_name to the (the current_name & the prefix_or_suffix) as string
		end if
		my set_item_name(this_item, the new_file_name)
	end if
end repeat
beep 2

on set_item_name(this_item, new_item_name)
	tell application "Finder"
		--activate
		set the parent_container_path to (the container of this_item) as text
		if not (exists item (the parent_container_path & new_item_name)) then
			try
				set the name of this_item to new_item_name
			on error the error_message number the error_number
				if the error_number is -59 then
					set the error_message to "This name contains improper characters, such as a colon (:)."
				else --the suggested name is too long
					set the error_message to error_message -- "The name is more than 31 characters long."
				end if
				--beep
				tell me to display dialog the error_message default answer new_item_name buttons {"Cancel", "Skip", "OK"} default button 3
				copy the result as list to {new_item_name, button_pressed}
				if the button_pressed is "Skip" then return 0
				my set_item_name(this_item, new_item_name)
			end try
		else --the name already exists
			--beep
			tell me to display dialog "This name is already taken, please rename." default answer new_item_name buttons {"Cancel", "Skip", "OK"} default button 3
			copy the result as list to {new_item_name, button_pressed}
			if the button_pressed is "Skip" then return 0
			my set_item_name(this_item, new_item_name)
		end if
	end tell
end set_item_name
 

Pill

Aktives Mitglied
Mitglied seit
21.02.2011
Beiträge
3.280
Probier das mal:

Code:
[FONT="Verdana"][size=2][b]set[/b] [color=#3F7F00]tag[/color] [b]to[/b] "#Original"

[b]tell[/b] [color=#0000FF][i]application[/i][/color] "Finder"
	[color=#0000FF][b]activate[/b][/color]
	[b]set[/b] [color=#3F7F00]theFiles[/color] [b]to[/b] [color=#6C04D4]selection[/color]
	[b]repeat[/b] [b]with[/b] [color=#3F7F00]aFile[/color] [b]in[/b] [color=#3F7F00]theFiles[/color]
		[b]set[/b] [color=#3F7F00]fileName[/color] [b]to[/b] [color=#0000FF][i]items[/i][/color] 1 [b]thru[/b] -(([color=#0000FF][b]count[/b][/color] [b]of[/b] [color=#0000FF][i]items[/i][/color] [b]of[/b] ([color=#6C04D4]name extension[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]as[/b] [color=#0000FF][i]text[/i][/color])) + 2) [b]of[/b] ([color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]as[/b] [color=#0000FF][i]text[/i][/color]) [b]as[/b] [color=#0000FF][i]text[/i][/color]
		[b]set[/b] [color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]to[/b] [color=#3F7F00]fileName[/color] & [color=#3F7F00]tag[/color] & "." & [color=#6C04D4]name extension[/color] [b]of[/b] [color=#3F7F00]aFile[/color]
	[b]end[/b] [b]repeat[/b]
[b]end[/b] [b]tell[/b][/size][/FONT]
 

The Dust Sailor

Mitglied
Thread Starter
Mitglied seit
23.09.2008
Beiträge
74
Ah super. Funktioniert ganz toll :) Hab mir das auch gleich noch so umgebaut, so dass ich mit einer Variante des Skripts auch einen Zusatz an den Anfang des Dateinamens schreiben könnte. Das ist 100 mal besser und schneller als der Automator!

Ein kleines Problem gibt es nur. Wenn ich das Skript auch für Ordner/Verzeichnisse anwende, wird ein Teil des Namens abgeschnitten, da ja hier kein Punkt vor der Erweiterung neu zu setzen wäre. Das ist natürlich dann die Kür. Wäre aber toll, wenn es dafür auch eine Lösung geben könnte.

Mit meinen fast nicht vorhandenen Applescript-Kenntnissen denke ich, dass man hier wohl eine Entweder (File) oder (Folder) Regel anwenden müsste, oder?

Zum Beispiel so ähnlich:
Code:
set Tag to "#MeinTag"

tell application "Finder"
	activate
	set theFiles to selection
	repeat with aFile in theFiles
		if item is file then
			set fileName to items 1 thru -((count of items of (name extension of aFile as text)) + 2) of (name of aFile as text) as text
			set name of aFile to fileName & Tag & "." & name extension of aFile
		end if
		if item is folder then
			set fileName to items 1 thru -((count of items of (name extension of aFile as text)) + 1) of (name of aFile as text) as text
			set name of aFile to fileName & Tag of aFile
		end if
	end repeat
end tell
Das funktioniert natürlich nicht, soll aber auch nur meinen guten Willen unter Beweis stellen *räusper* ;-)

Ein bisschen Hilfe wäre auch hier sehr nett.
Danke schon mal.
 

Pill

Aktives Mitglied
Mitglied seit
21.02.2011
Beiträge
3.280
Wie du bereits gesagt hast, ist eine if-Abfrage genau das Richtige:

Code:
[FONT="Verdana"][size=2][b]set[/b] [color=#3F7F00]Tag[/color] [b]to[/b] "#MeinTag"

[b]tell[/b] [color=#0000FF][i]application[/i][/color] "Finder"
	[color=#0000FF][b]activate[/b][/color]
	[b]set[/b] [color=#3F7F00]theFiles[/color] [b]to[/b] [color=#6C04D4]selection[/color]
	[b]repeat[/b] [b]with[/b] [color=#3F7F00]aFile[/color] [b]in[/b] [color=#3F7F00]theFiles[/color]
		[b]if[/b] [color=#0000FF][i]class[/i][/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]is[/b] [color=#0000FF][i]folder[/i][/color] [b]then[/b]
			[b]set[/b] [color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]to[/b] [color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color] & [color=#3F7F00]Tag[/color]
		[b]else[/b]
			[b]set[/b] [color=#3F7F00]fileName[/color] [b]to[/b] [color=#0000FF][i]items[/i][/color] 1 [b]thru[/b] -(([color=#0000FF][b]count[/b][/color] [b]of[/b] [color=#0000FF][i]items[/i][/color] [b]of[/b] ([color=#6C04D4]name extension[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]as[/b] [color=#0000FF][i]text[/i][/color])) + 2) [b]of[/b] ([color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]as[/b] [color=#0000FF][i]text[/i][/color]) [b]as[/b] [color=#0000FF][i]text[/i][/color]
			[b]set[/b] [color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]to[/b] [color=#3F7F00]fileName[/color] & [color=#3F7F00]Tag[/color] & "." & [color=#6C04D4]name extension[/color] [b]of[/b] [color=#3F7F00]aFile[/color]
			
		[b]end[/b] [b]if[/b]
	[b]end[/b] [b]repeat[/b]
[b]end[/b] [b]tell[/b][/size][/FONT]
 

little_pixel

Aktives Mitglied
Mitglied seit
06.06.2006
Beiträge
4.629
Hallo,

ich würde es nicht so machen, da es Bundles etc. gibt, die dem Anwender nur als Datei sichtbar sind.
Mit dieser Prüfung würden diese "Dateien" durchfallen.

- Dateiendung holen
- prüfen, ob diese größer 0 ist
- wenn ja, dann die Dateiendung zu applescript's text item delimiters setzen
- letzten Eintrag in der Liste löschen und wieder zusammensetzen

Viele Grüße
 

Pill

Aktives Mitglied
Mitglied seit
21.02.2011
Beiträge
3.280
Vielleicht verstehe ich dich falsch, aber wenn ich z.B. ein App-Bundle markiere, dann wird es von AppleScript als application file erkannt und der Tag wird vor der Endung eingefügt.
 

little_pixel

Aktives Mitglied
Mitglied seit
06.06.2006
Beiträge
4.629
Okay, super.
Hatte das anders in Erinnerung bzw. ich bin mir fast sicher, dass das Früher anders war.
Mit "class" hatte ich immer nur Ärger.

Viele Grüße
 

The Dust Sailor

Mitglied
Thread Starter
Mitglied seit
23.09.2008
Beiträge
74
Ich bin begeistert. Das Skript funktioniert jetzt wunderbar auch mit Ordnern. Dickes Dankeschön dafür :)
 

The Dust Sailor

Mitglied
Thread Starter
Mitglied seit
23.09.2008
Beiträge
74
Hier noch mal eine Zusammenfassung für Applescript-Dummies (wie mich).

Dieses Applescript setzt einen beliebigen Begriff an das Ende des Dateinamens vor die Dateierweiterung. Ich benutze das Skript zum Tagen, um bestimmte Dateien nachher besser mit Spotlight wieder finden zu können. Anders als bei Tags im Spotlight-Kommentarfeld, bleibt dieser Tag auch unter Windows benutzbar. Ausserdem hat ausgerechnet die Automator-Aktion zum Ändern des Dateinamens die doofe Eigenschaft, das Spotlight-Kommentarfeld zu löschen. Aber auch bei anderen Gelegenheiten ist mir der Spotlight Kommentar schon abhanden gekommen (z. B. beim Synchronisieren mit spezieller Software, wie Chronosync). Deswegen tagge ich den Dateinamen.

So sieht das aus:
Durch einen Klick auf das Skript (am besten in der Titelleiste des Finderfensters ablegen... kann man auch mit einem schönen Icon versehen) wird an die markierte Datei (oder mehrere Dateien) der gewünschte Begriff angehängt

Vorher: DSC02452.jpg
Nachher: DSC02452_#meinTag.jpg

Den folgenden Code in den Skripteditor einfügen, in der ersten Zeile den Begriff " #MeinTag" anpassen und das Skript als Programm abspeichern (kann man im "Sichern unter"-Dialog auswählen).

Code:
set Tag to "_#MeinTag"

tell application "Finder"
	activate
	set theFiles to selection
	repeat with aFile in theFiles
		if class of aFile is folder then
			set name of aFile to name of aFile & Tag
		else
			set fileName to items 1 thru -((count of items of (name extension of aFile as text)) + 2) of (name of aFile as text) as text
			set name of aFile to fileName & Tag & "." & name extension of aFile
			
		end if
	end repeat
end tell

Und hier noch eine Variante des Skripts, damit man einen Begriff an den Anfang des Dateinamens setzen kann (um vielleicht die Sortierreihenfolge im Finder zu beeinflussen)

Vorher: DSC02452.jpg
Nachher: #meinTag_DSC02452.jpg

CODE:
Code:
set Tag to "#MeinTag_"

tell application "Finder"
	activate
	set theFiles to selection
	repeat with aFile in theFiles
		set name of aFile to Tag & name of aFile
	end repeat
end tell
Beide Skripte funktionieren bei mir ganz toll!


Warum benutze ich nicht den Automator, wo man doch als Laie mit wenigen Handgriffen eine Aktion mit der gleichen Funktion herstellen kann?
1. Wie oben schon erwähnt, löscht die Automator-Aktion das Spotlight Kommentarfeld. Doof, denn z. B. bei Filmaufnahmen kopiere ich dort immer die Inhaltsangabe des Films rein.
3 Applecript ist deutlich ressourcenschonender und schneller als der Automator. Wenn man schnell mal an eine Handvoll Dateien 3 oder 4 Tags anfügen möchte, merkt man den Unterschied recht deutlich. Auf meinem MacBook von 2009 wird der Automator mit zunehmender Zeit bei sehr häufiger Benutzung immer langsamer, besonders wenn ich parallel noch mit anderen Programmen arbeite. Es kommt sogar vor, dass sich nach einiger Zeit Automator-Aktionen komplett aufhängen und das nervt (das ist mir bei Applescripts noch nie passiert).

Das heißt jetzt nicht, dass ich vom Automator abrate. Nein, bei "normaler" Benutzung ist der ganz toll für Leute ohne Applescript-Kenntnisse. Habe selber ganz viele Automator-Aktionen im Kontextmenü bei den Diensten untergebracht.

Ich habe auch schon versucht, die Funktion des Skripts mit "A Better Finder Rename"-Droplets zu bewerkstelligen, aber dann startet bei jeden Vorgang das Programm im Hintergrund und das ist auch nicht der Sinn der Sache.
 
Zuletzt bearbeitet:

Pill

Aktives Mitglied
Mitglied seit
21.02.2011
Beiträge
3.280
Das 2. Skript enthält noch einen kleinen Fehler in Zeile 7, hier muss es heissen:

set name of aFile to Tag & name of aFile

Du kannst das aber auch sehr viel einfacher halten, da man hier nicht zwischen Ordner oder Datei unterscheiden muss:

Code:
[FONT="Verdana"][size=2][b]set[/b] [color=#3F7F00]Tag[/color] [b]to[/b] "#MeinTag_"

[b]tell[/b] [color=#0000FF][i]application[/i][/color] "Finder"
	[color=#0000FF][b]activate[/b][/color]
	[b]set[/b] [color=#3F7F00]theFiles[/color] [b]to[/b] [color=#6C04D4]selection[/color]
	[b]repeat[/b] [b]with[/b] [color=#3F7F00]aFile[/color] [b]in[/b] [color=#3F7F00]theFiles[/color]
		[b]set[/b] [color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color] [b]to[/b] [color=#3F7F00]Tag[/color] & [color=#6C04D4]name[/color] [b]of[/b] [color=#3F7F00]aFile[/color]
	[b]end[/b] [b]repeat[/b]
[b]end[/b] [b]tell[/b][/size][/FONT]
 
Oben