[GastForen Programmierung/Entwicklung AppleScript "Punkt" an 4. Stelle des Dateinamens entfernen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

"Punkt" an 4. Stelle des Dateinamens entfernen

Anonym
Beiträge gesamt: 22827

11. Jan 2006, 09:34
Beitrag # 1 von 13
Bewertung:
(3944 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
wir haben da ne ziemlich blöde Sache: über 5.000 Bilder fürs Web, bei denen sich in vielen Fällen ein Punkt als optisches Trennzeichen in den Dateinamen eingeschlichen hat. Der Punkt steht IMMER an der 4. Stelle und die Dateinamenlänge mit Punkt ist IMMER 8-stellig. Beispiel:
123.4567 muss zu 1234567 werden.

Zuweilen fehlt auch mal die Suffix (immer ".jpg"). Ideal wäre es, wenn die Suffix angehängt werden würde, wo sie fehlt.

Ich bastle gerade daran, komm aber auf keinen grünen Zweig. Hat jemand sowas schon mal gemacht oder ne Idee dazu??

Ich versuch das so hin zu bekommen, das ich einen Ordner mit den zu prüfenden/ändernden Bildern auf das Programm ziehe und dann alles überprüft bzw. geändert wird.

Viele Grüße aus Mainfranken
Gerd

PS: Ich bekomme demnächst ne AS Schulung; Ich hoffe, ich kann dann auch einigen Leuten dann was weitergeben.... :D
X

"Punkt" an 4. Stelle des Dateinamens entfernen

Hans Haesler
  
Beiträge gesamt: 5826

11. Jan 2006, 10:03
Beitrag # 2 von 13
Beitrag ID: #420677
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerd,

nun, ich habe schon etliche Scripts zum ändern von Datei- oder Ordnernamen entwickelt.
Aber jedes Mal mussten natürlich die Voraussetzungen berücksichtigt werden.

Ich werde mal nach einen bestehenden Script forschen und versuchen, es anzupassen.

Gruss, Hans


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

TMA
Beiträge gesamt: 399

11. Jan 2006, 11:01
Beitrag # 3 von 13
Beitrag ID: #420678
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerd,
versuchs mal hiermit:

property newSuffix : ""
global tmpNameOhneSuffix, cleanList


on Initialize()
   set my newSuffix to text returned of (display dialog "Bitte neues Suffix angeben:" with icon 1 default answer my newSuffix)
   set cleanList to {{".", ""}}
end Initialize


on Finalize()
   activate
   display dialog "Fertig."
end Finalize


on ProcessAFile(aFile)
   tell application "Finder"
      if (name of aFile as string) is in {".DS_Store", "Icon"} then return false
      set tmpName to name of aFile as string
      set tmpNameOhneSuffix to suffixDel(tmpName) of me as string
      set destFileNameNew to my nameCleaner(tmpNameOhneSuffix, my cleanList) as string
      try
         set name of aFile to destFileNameNew & my newSuffix
      on error
         my FehlerSuffix()
      end try
   end tell
   --
   -- file process
   --
end ProcessAFile


on FehlerSuffix()
   activate
   display dialog "Die Datei " & tmpNameOhneSuffix & " wurde nicht bearbeitet. Prüfen!!" giving up after 5
end FehlerSuffix


on nameCleaner(nameToClean, RepList)
   set tmpDelimiters to my text item delimiters
   repeat with dels in RepList
      set my text item delimiters to item 1 of dels
      set nameToClean to every text item of nameToClean
      set my text item delimiters to item 2 of dels
      set nameToClean to nameToClean as string
   end repeat
   set my text item delimiters to tmpDelimiters
   return nameToClean
end nameCleaner


on ProcessAFileOrFolder(theFile)
   
   --
   --   This handler processes a file or a folder.  If its a folder, we recure
   --   into ScanAFolder.  If its a file, we call the user handler "ProcessAFile"
   --   to deal with the file
   --
   
   set theFileInfo to info for theFile
   if folder of theFileInfo then
      ScanAFolder(theFile)
   else
      ProcessAFile(theFile)
   end if
end ProcessAFileOrFolder


on ScanAFolder(theFolder)
   
   --
   --   This handler scans through a folder.  The ProcessAFile hander is called for each file
   --   found in the folder.  Folders are handled by calling ScanFolder to recursivly
   --   work through the folder tree
   --
   
   set fileNames to list folder theFolder
   repeat with aFile in fileNames
      set theFile to (theFolder as string) & contents of aFile
      ProcessAFileOrFolder(alias theFile)
   end repeat
end ScanAFolder


on open of filesList
   
   --
   --   Drag and drop handler.  Pass each of the files or folders to ScanAFile which does the right
   --   thing.
   --
   
   Initialize()
   repeat with aFile in filesList
      ProcessAFileOrFolder(contents of aFile)
   end repeat
   Finalize()
end open


on run
   
   --
   --   Run handler.  Prompt the user for a file to process.
   --
   Initialize()
   set theFile to choose file
   ProcessAFile(theFile)
   Finalize()
end run


on suffixDel(i)
   set text item delimiters of me to ""
   set i to i as string
   if i contains "." then
      set my text item delimiters to "."
      set i to every text item of i
      if (count of every character of (last item of i as string)) <= 4 then
         set i to (items 1 thru -2 of i) as string
         set my text item delimiters to ""
         return i
      else
         set i to i as string
         set text item delimiters of me to ""
         return i
      end if
   else
      return i
   end if
end suffixDel


Du kannst ein neues Suffix angeben, in deinem Fall ".jpg". Sicherheitshalber werden vorher alle Suffixe entfernt und neu gesetzt (damit du immer die richtigen hast).
Die "cleanList" kann natürlich beliebig erweitert werden, z.B. für Sonderzeichen usw.:

set cleanList to {{"ü", "ue"}, {"ä", "ae"}, {"ö", "oe"}, {" ", "_"}, {"-", "_"}, {"+", "_"}, {"ü", "ue"}, {"ä", "ae"}, {"ö", "oe"}}

Einfach Script starten oder Files oder Ordner draufziehen...

Gruß
TMA


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

Hans Haesler
  
Beiträge gesamt: 5826

11. Jan 2006, 11:15
Beitrag # 4 von 13
Beitrag ID: #420679
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerd,

und hier ist meine Lösung ... Als Programm sichern. Dann können die Dateien (oder Ordner, welche die
Dateien enthalten) darauf gezogen werden:
---
global ctr

on run
   display dialog "Die umzubenennenden Dateien
(oder Ordner mit Dateien)
auf das Icon dieses Droplets ziehen." buttons "OK" default button 1 with icon 2
end run

on open allObjects
   set ctr to 0
   -- den Doppelpunkt als Texttrenner definieren, damit in den Subroutinen,
   -- welche die Dateien und Ordner behandeln, deren Name ausgezogen werden kann
   set AppleScript's text item delimiters to {":"}
   -- eine Wiederholungsschleife durch die gedroppten Objekte ...
   repeat with aObject in allObjects
      -- ... welche einzeln zum Handler 'processObject' geschickt werden
      processObject(aObject)
   end repeat
   -- den Textelement-Trenner wieder auf den Vorgabe-Wert (= leerer String) zurücksetzen
   set AppleScript's text item delimiters to {""}
   -- wenn der Wert der Zählers 'ctr' Null ist, einen Dialog zeigen: die Script-Aktion ist fertig
   -- sonst anzeigen, wieviele Dateien nicht umbenannt werden konnten
   if ctr is 0 then
      display dialog "Fertig." buttons "OK" default button 1 giving up after 1
   else
      display dialog "Nicht umbenannte Dateien: " & ctr & "

(Konflikt: identische Namen)." buttons "OK" default button 1 with icon 2
   end if
end open

-- der Handler, welcher die gedroppten Objekt prüft
-- den Inhalt von Ordnern listet er auf und schickt die Elemente an sich selbst
-- Dateien werden an den 'processFile'-Handler weitergegeben
on processObject(aObject)
   -- wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner ...
   if (aObject as Unicode text) ends with ":" then
      -- die Liste der Objekte wird erstellt (ohne unsichtbare Dateien)
      set contentsList to list folder aObject without invisibles
      -- Wiederholungsschleife durch diese Liste
      repeat with anItem in contentsList
         -- der Pfad wird zusammengesetzt
         set objPath to ((aObject as Unicode text) & anItem)
         -- die Elemente (Dateien oder Ordner) werden an den aktuellen Handler geschickt
         processObject(objPath as alias)
      end repeat
      -- ... sonst ist das Objekt eine Datei
   else
      set curFile to (aObject as Unicode text)
      -- den Pfad dem Handler 'processFile' übergeben
      processFile(curFile)
   end if
end processObject

-- in diesem Handler wird der Name der Datei geprüft, der Punkt entfernt
-- und falls notwendig mit dem Suffix versehen
on processFile(aFile)
   set fileName to last text item of aFile
   if character 4 of fileName is "." then
      set newName to text 1 thru 3 of fileName & text 5 thru -1 of fileName
   end if
   if not (newName ends with ".jpg") then set newName to newName & ".jpg"
   try
      tell application "Finder" to set name of file aFile to newName
   on error
      set ctr to ctr + 1
   end try
end processFile

---
Gruss, Hans


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

TMA
Beiträge gesamt: 399

11. Jan 2006, 11:33
Beitrag # 5 von 13
Beitrag ID: #420680
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Hans,
Für Gerds Zwecke ausreichend, würde aber sagen das man deinen "processFile"-Handler globalisieren sollte, damit andere auch was damit anfangen können.
Es ist ja nicht bei jedem User so das der Filename aus 8 Stellen besteht und der Punkt immer an 4.Stelle ist.
Was passiert wenn eine Datei, aus welchen Gründen auch immer, mit einem anderen Suffix als ".jpg" benannt ist? Dann würde Gerd ein solches File erhalten: 12345678.tif.jpg
Nicht so gut. Daher würde ich meine Methode vorziehen. Außerdem kann bei meiner Methode die Liste der zu ersetzenden Zeichen im Dateinamen beliebig erweitert werden und ist nicht stellen-Abhängig.

Dieses nur als Anregung.

Gruß und noch einen schönen Tag wünscht
TMA


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

Hans Haesler
  
Beiträge gesamt: 5826

11. Jan 2006, 12:49
Beitrag # 6 von 13
Beitrag ID: #420681
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo TMA,

stimmt, wenn ein ".tif"-File darunter ist, dann würde das ".jpg" einfach angehängt. Man sollte
also einen Test einbauen, welcher mindestens prüft, ob das viertletzte Zeichen ein Punkt ist.

Doch Deine Lösung ist auch nicht "bullet-proof": Es gibt keine Prüfung, ob die Zeichen, welche
abgeschnitten werden, wirklich Suffixe sind. Und es wird auch nicht getestet, ob es sich um
Bilddateien handelt.

übrigens gibt es auch Suffixe mit zwei Buchstaben. Und mit vier. Und mit elf ...

Deshalb habe ich lieber ein Script nach Mass, welches einmalig eingesetzt wird, um das aktuelle
Problem zu lösen, als eines, das unversell gebraucht werden kann aber bei welchem &#150; je nach
Aufgabe &#150; doch noch der eine oder andere Mangel entdeckt wird.

Ich glaube, dass Gerd nur seine Mit-Punkt-versehenene-JPEGs aufs Droplet ziehen wird und nicht
noch irgendwelche andere Datei-Typen.

Gruss, Hans


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

TMA
Beiträge gesamt: 399

11. Jan 2006, 13:03
Beitrag # 7 von 13
Beitrag ID: #420682
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Hans,
das ist richtig.
Man kann ja noch ne abfrage mit reinbringen, ungefähr so:

set SuffixTypeList to {{"EPSF", ".eps"}, {"TIFF", ".tif"}, {"JPEG", ".jpg"}, {"8BPS", ".psd"}, {"XPRJ", ".qxd"}, {"XDOC", ".pxd"}, {"PDF ", ".pdf"}, {"GIFf", ".gif"}, {"PICT", ".pct"}, {"BMP ", ".bmp"}, {"PCX ", ".pcx"}}
set filetype to get file type of aFile
repeat with i in SuffixTypeList
   if filetype is (item 1 of i as string) then
      try
         set name of aFile to tmpNameOhneSuffix & (item 2 of i as string)
      on error
         my FehlerSuffix()
      end try
   end if
end repeat


Mein suffixDel-Handler läuft übrigends auch mit 2 und 4-stelligen suffixen. Mehr wie 4 Stellen hab ich bis jetzt noch nicht gehabt.

Naja muss man halt probieren was man so für sich brauchen kann.
Ich finds übrigends toll das man hier im forum gut zusammenarbeiten kann und immer was dazu lernt.

Gruß
TMA


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

Hans Haesler
  
Beiträge gesamt: 5826

11. Jan 2006, 14:17
Beitrag # 8 von 13
Beitrag ID: #420683
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo TMA,

sorry, ich habe in der Eile das "kleiner als"-Zeichen übersehen.

Ja, ein Test wäre gut. Aber ich würde nicht die Dateitypen prüfen. Weil diese unter Mac OS X
nicht mehr willkommen sind. Und manche Dateien statt, z.B., "JPEG" einen leeren String oder
'undefined' zurückgeben.

Weil ja man das zu prüfende Suffix "in der Hand" hat, kann man sich damit begnügen, eine Liste
der bekannten aufzustellen.
---
if aSuffix is in {".eps", ".tif", ".jpg", ".psd", ".qxp", ".qxd", ".pdf", ".gif", ".pct", ".bmp", ".pcx"} then
   -- dann kann das Suffix abgetrennt werden
end if

---
Achtung: Das Suffix eines XPress-Projekts ist ".qxp" und jenes eine XPress-Dokuments ".qxd"!

Gruss, Hans


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

TMA
Beiträge gesamt: 399

11. Jan 2006, 14:26
Beitrag # 9 von 13
Beitrag ID: #420684
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Hans,
gut das du das suffix für xpress noch erwähnst. XPRJ ist natürlich ".qxp"
Beim überprüfen meiner suffixList ist mir da auch aufgefallen das das 2. item für type XDOC mit ".pxd" benannt ist. muss natürlich ".qxd" sein. Q statt P. der fehlerteufel mal wieder.

Danke und Gruß
TMA


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

Anonym
Beiträge gesamt: 22827

11. Jan 2006, 16:56
Beitrag # 10 von 13
Beitrag ID: #420685
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
hier ist ein erstaunter und etwas verwirrter Gerd. Vorab: Vielen Dank euch beiden. Das sieht irgendwie etwas anders aus, als was ich probiert hab (und was auch nicht funktioniert hatte). Ich probier das mal aus.

Merci Euch beiden,
Gerd


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

Anonym
Beiträge gesamt: 22827

14. Jan 2006, 19:25
Beitrag # 11 von 13
Beitrag ID: #420686
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo tma,

wunderbares script, das erweitern der ersetzten-funktion geht prima. hab mein selbstgebasteltes script gleich in die tonne geklopft:)

thx

cu

hans


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

Hans Haesler
  
Beiträge gesamt: 5826

14. Jan 2006, 22:05
Beitrag # 12 von 13
Beitrag ID: #420687
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans Gerd,

kleiner Hinweis: Im Handler ScanAFolder(theFolder) sollte die Zeile ...
Code
[b]set fileNames [b]to list folder theFolder 

... mit [b]without invisibles ergänzt werden.

Dann könnte man im Handler ProcessAFile(aFile) die Zeile ...
Code
[b]if (name [b]of aFile [b]as string) [b]is in {".DS_Store", "Icon"} [b]then return false 

... weglassen.

übrigens: Das "Icon" ist nicht korrekt. Richtig wäre ein Return als Abschluss: {".DS_Store", "Icon
"}

Gruss, Hans


als Antwort auf: [#420676]

"Punkt" an 4. Stelle des Dateinamens entfernen

Hans Haesler
  
Beiträge gesamt: 5826

15. Jan 2006, 10:26
Beitrag # 13 von 13
Beitrag ID: #420688
Bewertung:
(3943 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
... noch was: Der Gebrauch von 'info for' zum Feststellen, ob das Objekt ein Ordner oder eine
Datei ist, hat zur Folge, dass es bei Ordnern, welche viele Unterordner mit vielen Dateien haben,
relativ lange dauert, bis das Resultat bekannt ist.

Warum? Im Record von 'info for' werden unter 'size' auch die Anzahl Bytes angezeigt. Aber diese
müssen zuvor erst addiert werden. Und das kann dauern.

Schneller: Den Pfad in einen String umwandeln und feststellen, ob dieser mit einem Doppelpunkt
endet oder nicht. Wenn ja, ist das Ding (meistens) ein Ordner, sonst eine Datei.

Wieso meistens? Nun, der Pfad zu einer Applikation endet auch mit einem Doppelpunkt. Aber weil
sich die Programme im Programmordner befinden sollten &#150; und nicht in einem Produktionsordner &#150;
kann man diese Ausnahme vergessen.

Gruss, Hans


als Antwort auf: [#420676]
X