| 
	
		| 
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| stevencologne •->
 
  
 
 Anmeldedatum: 19.09.2011
 Beiträge: 13
 
 
 | 
			
				|  Verfasst am: 19.09.2011 - 16:52    Titel: Zahlenkolone im Dateinamen erkennen und Rest löschen |   |  
				| 
 |  
				| Hallo, 
 ich bin absoluter Anfänger in Sachen AppleScript und suche Hilfe:
 
 Ich würde gerne per Script die Dateinamen in einem Verzeichnis dahin gehend "untersuchen", das per Script im Dateinamen eine Kolone von 7 Zahlen erkannt und automatisch der komplette Rest des Dateinamens gelöscht wird.
 
 Weiter wäre es klasse, wenn automatisch erkannt wird, ob 7 hintereinander folgende Zahlen vorhanden sind und wenn nicht (dann sind es 6 Zahlen), automatisch eine "0" vorangestellt wird.
 
 Hintergrund: Ich habe immer mal wieder Verzeichnisse mit über 1.400 Bilddateien drin und müsste diese zur leichteren Verarbeitung "bereinigen".
 
 Kann mir jemand helfen?
 
 Das wäre sooooo klasse
   
 Danke und Gruss
 
 Stefan
 |  |  
		| Nach oben |  |  
		|  |  
		| woodpecker •--->
 
  
 
 Anmeldedatum: 12.10.2010
 Beiträge: 150
 Wohnort: Roggentin/Rostock
 
 | 
			
				|  Verfasst am: 20.09.2011 - 09:57    Titel: |   |  
				| 
 |  
				| Hallo Stefan, du kannst es mal damit versuchen:
 
 set dirx to choose folder
 set dirx to POSIX path of dirx
 set dir to do shell script "ls " & dirx
 set dir to every paragraph of dir
 
 set dir1 to {}
 
 repeat with i from 1 to count dir
 set dir0 to item i of dir
 set dirx to Substitute of me for "[^0-9]" by "" into dir0 with GlobalChg
 
 # jetzt werden nur die Verzeichniseinträge bearbeitet, die aus 6 oder 7 Ziffern bestehen
 if count of dirx is equal to 6 then set dirx to "0" & dirx
 
 if (count of dirx) is 7 then
 copy {alt:dir0, neu:dirx} to end of dir1
 end if
 
 end repeat
 dir1
 
 on Substitute for old by new into Txt given GlobalChg:mode
 set m to ""
 set g to "0"
 if mode then
 set m to "g"
 set g to "1"
 end if
 set EndOfFile to my EOFHereDoc()
 set awk to "<<" & EndOfFile & "  awk  -v G=" & g & " '{if(G || !n ) n=" & m & "sub(\"" & old & "\", \"" & new & "\");print $0 } '
 " & Txt & "
 " & EndOfFile
 return do shell script awk
 end Substitute
 on EOFHereDoc()
 set StrEOF to "Das+ist+ein+Text+der+den+EOF+String+fuer+HereDocuments+liefert.Er+kann+beliebig+verlaengert+werden.Aber+Vorsicht+mit+Sonderzeichen"
 set EndOfFile to {}
 repeat with k from 1 to ((random number from 15 to 20) as integer)
 copy some character of StrEOF to end of EndOfFile
 end repeat
 return EndOfFile as string
 end EOFHereDoc
 
 Dieses Skript produziert dir eine Liste aller in frage kommenden Verzeichniseinträge eines Verzeichnisses, das du selbst auswöhlen kannst. Jedes Element der Liste ist ein record und sieht so aus:
 {alt:altername,neu:neuername}
 Die Liste schaust Du dir an und wenn es das ist, was Du haben willst, musst Du sie nur noch abarbeiten um die Dateien umzubenennen.
 
 Gruß woodpecker
 |  |  
		| Nach oben |  |  
		|  |  
		| stevencologne •->
 
  
 
 Anmeldedatum: 19.09.2011
 Beiträge: 13
 
 
 | 
			
				|  Verfasst am: 20.09.2011 - 10:53    Titel: |   |  
				| 
 |  
				| Hallo Woodpecker, 
 klasse, das ist cool, danke. Nur zwei Fragen/Bitten hätte ich noch:
 
 1) In der Ausgabe wird nun auch alles hinter dem Punkt (.tif) gelöscht.
 Wäre klasse, wenn das Script das erhalten würde.
 
 2) Kann man das auch so machen, das die Dateien nun automatisch mit dem neuen Dateinamen bezeichnet werden?
 
 Gruss
 
 Stefan
 
 EDIT: Stelle gerade fest, das, wenn im Dateinamen ausserhalb der Kolone von 6 bzw. 7 Zahlen eine weitere einzelne Zahl steht, diese im neuen Dateinamen drin bleibt
   
 Kriegt man das noch in den Griff? Ich hoffe, es ist nicht unverschämt, wenn ich das so frage
  ))))))))))))) |  |  
		| Nach oben |  |  
		|  |  
		| woodpecker •--->
 
  
 
 Anmeldedatum: 12.10.2010
 Beiträge: 150
 Wohnort: Roggentin/Rostock
 
 | 
			
				|  Verfasst am: 20.09.2011 - 15:29    Titel: |   |  
				| 
 |  
				| Hallo Stefan, es geht alles. Du solltest mir aber mal ein paar Beispiele für die Dateinamen geben, die typisch sind. Zum Beispiel:
 
 X5644345.tif  wird zu 5644345.tif
 ABC445566H02.tif wird zu 0445566.tif
 XX1234567.tif  wird zu 1234567.tif
 
 Haben die alle Die Endung .tif ?
 Es geht also nur um die Dateinamen, die eine unununterbrochene Folge von 6 oder 7 Ziffern aufweisen und die Endung .tif haben. Die Ziffernfolge möchtest Du ermitteln und diese Files sollen umbenannt werden in:
 <ziffernfolge>.tif
 Ist das richtig?
 |  |  
		| Nach oben |  |  
		|  |  
		| Skeeve •---->
 
  
  
 Anmeldedatum: 20.04.2006
 Beiträge: 1067
 
 
 | 
			
				|  Verfasst am: 20.09.2011 - 21:44    Titel: |   |  
				| 
 |  
				| Probier mal dies. Das sollte auch mit Ordnern klarkommen, die ein Leerzeichen im Namen haben: 
 
  	  | Code: |  	  | set dirx to choose folder set dirx to POSIX path of dirx
 set dir to do shell script "cd " & (quoted form of dirx) & " ; perl -e " & (quoted form of "
 foreach $fname (<*>) {
 next unless -f $fname;
 next unless $fname=~ /(\\d{6,7}).*?(\\.[^\\.]+)?$/;
 printf qq:%s\\t%07d%s\\n:, $fname, $1, $2;
 }
 ")
 
 set dir1 to {}
 repeat with zeile in every paragraph of dir
 set p to offset of tab in zeile
 copy {alt:text 1 thru (p - 1) of zeile, neu:text (p + 1) thru -1 of zeile} to end of dir1
 end repeat
 dir1
 
 | 
 _________________
 "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
 |  |  
		| Nach oben |  |  
		|  |  
		| stevencologne •->
 
  
 
 Anmeldedatum: 19.09.2011
 Beiträge: 13
 
 
 | 
			
				|  Verfasst am: 21.09.2011 - 11:08    Titel: |   |  
				| 
 |  
				| Hallo Woodpecker, 
 es gibt ganz verschiedene Dateinamen:
 
 Beispielhaft:
 1) var1_1234567_neu.tif
 2) 1_7654321.tif
 3) var2_123456_vollseite.tif
 
 1) sollte werden 1234567.tif
 2) sollte werden 7654321.tif
 3) sollte werden 0123456.tif (Null vorne dran hängen)
 
 Das einzige, was alle Dateinamen gleichermaßen haben
 sind 6 bzw. 7 Ziffern hintereinander - um die geht es dann
 in den neuen Dateinamen, wobei bei einer vorhandenen
 Zahlenkolone mit 6 Zahlen eine Null vorne dran sollte ...
 
 Danke für eure Hilfe
   
 Gruss
 
 Stefan
 |  |  
		| Nach oben |  |  
		|  |  
		| woodpecker •--->
 
  
 
 Anmeldedatum: 12.10.2010
 Beiträge: 150
 Wohnort: Roggentin/Rostock
 
 | 
			
				|  Verfasst am: 21.09.2011 - 14:14    Titel: |   |  
				| 
 |  
				| Da habe ich jetzt noch mal in meine Werkzeugkiste gegriffen und folgendes rausgeholt: 
 
 
  	  | Code: |  	  | set dirx to choose folder
 set dirx to POSIX path of dirx
 set dir to do shell script "ls " & dirx
 set dir to every paragraph of dir
 
 
 
 set dir1 to {}
 
 repeat with i from 1 to count dir
 set dir0 to item i of dir
 set matchz to |Match| of me for "[0-9]{6,7}" into dir0
 set tif to |Match| of me for "\\.tif$" into dir0
 
 set col to item 3 of matchz
 set ext to item 3 of tif
 
 if (count of col) is 6 then set col to "0" & col
 if col is not "" then
 set neu to col & ext
 
 copy {alt:dir0, neu:neu} to end of dir1
 end if
 end repeat
 #diese wird entfernt, damit die Umbenennung erfolgt
 return dir1
 # Hier kommt jetzt die Schleife, die alle Dateien umbenennt
 # Die würde ich aber erst aktivieren, wenn alles gut aussieht. Dazu musst du nur die return-Anweisung oben entfernen oder auskommentieren
 repeat with i from 1 to count dir1
 set rec to item i of dir1
 do shell script "cd " & dirx & "; mv " & (alt of rec) & " " & (neu of rec)
 end repeat
 
 
 on Substitute for old by new into Txt given GlobalChg:mode
 set m to ""
 set g to "0"
 if mode then
 set m to "g"
 set g to "1"
 end if
 set EndOfFile to my EOFHereDoc()
 set awk to "<<" & EndOfFile & " awk -v G=" & g & " '{if(G || !n ) n=" & m & "sub(\"" & old & "\", \"" & new & "\");print $0 } '
 " & Txt & "
 " & EndOfFile
 return do shell script awk
 end Substitute
 on EOFHereDoc()
 set StrEOF to "Das+ist+ein+Text+der+den+EOF+String+fuer+HereDocuments+liefert.Er+kann+beliebig+verlaengert+werden.Aber+Vorsicht+mit+Sonderzeichen"
 set EndOfFile to {}
 repeat with k from 1 to ((random number from 15 to 20) as integer)
 copy some character of StrEOF to end of EndOfFile
 end repeat
 return EndOfFile as string
 end EOFHereDoc
 on |Match| for pattern into Txt
 set NullMatch to {0, 0, ""}
 if |CheckPattern|(pattern) then
 return NullMatch
 end if
 set EndOfFile to my EOFHereDoc()
 set awk to "<<" & EndOfFile & " awk  '/" & pattern & "/ { match($0,\"" & pattern & "\") ;s=1;line=$0;n=RSTART;nextfile }
 {    idx += length+1    }
 END { printf \"%d %d :%s\", s?idx+n:0,s?RLENGTH:0,substr(line,RSTART,RLENGTH)  }    '
 " & Txt & "
 " & EndOfFile
 
 set rc to do shell script awk
 
 if rc is equal to "" then return NullMatch
 set Position to 1st word of rc as number
 set Lengthx to 2nd word of rc as number
 set rc to {Position, Lengthx, Substr(rc, 1 + |StrIndex|(rc, ":"), Lengthx)}
 return rc
 
 end |Match|
 # check embedded slash and newline
 on |CheckPattern|(pattern)
 
 if pattern contains "/" then
 display dialog "pattern may not contain slash" buttons {"OK"} default button 1
 return true
 end if
 if pattern contains "
 " then
 display dialog "pattern may not contain newline" buttons {"OK"} default button 1
 return true
 end if
 return false
 end |CheckPattern|
 # Position eines Pattern  innerhalb eines Strings Txt
 # Das Pattern kann ein beliebiger regulärer Ausdruck sein
 # Es wird die Position des ersten Pattern innerhalb des Strings zurückgegeben
 on |StrIndex|(Txt, pattern)
 
 if |CheckPattern|(pattern) then
 return 0
 end if
 set EndOfFile to my EOFHereDoc()
 
 set awk to "<<" & EndOfFile & "  awk  '/" & pattern & "/ { match($0,\"" & pattern & "\");n=RSTART ;s=1;nextfile}
 { idx += length+1   }
 END {printf s ?  idx+n : 0} '
 " & Txt & "
 " & EndOfFile
 set rc to do shell script awk
 return rc as number
 
 end |StrIndex|
 # Regeln: Patternsuche geht nicht über Zeilengrenzen
 #              Ein Pattern darf kein Slash oder Newline enthalten
 
 # Rueckgabe eines Teilstrings
 # spos - Startposition, beginnend bei 1 (beschreibt die Startposition ein Zeichen ausserhalb
 # des Strings, wird ein Leerstring zurückgegeben)
 # len - Länge des Teilstrings, wenn positiv, beliebig gross
 # wenn negativ oder 0 wird die Länge 1 benutzt.
 
 on Substr(Txt, spos, len)
 set EndOfFile to my EOFHereDoc()
 set Ntxt to do shell script "wc -c <<" & EndOfFile & "
 " & Txt & "
 " & EndOfFile
 set Ntxt to Ntxt as number
 
 if spos is not greater than 0 or spos is greater than Ntxt then return ""
 if len is not greater than 0 then set len to 1
 
 set awk to "<<" & EndOfFile & " awk -v S=" & spos & " -v L=" & len & " '   {  if( length > S ) { rc=substr($0,S,L) ; nextfile} else S-=length+1}
 END {print rc}'
 " & Txt & "
 " & EndOfFile
 set rc to do shell script awk
 return rc
 end Substr
 
 
 | 
 
 Dieses Skript erzeigt wieder erst mal eine Liste von records. Diese Liste musst Du Dir ansehen. Wenn das alles so OK ist, entfernst Du die Anweisung
 return dir1
 
 Viel Erfolg
 |  |  
		| Nach oben |  |  
		|  |  
		| stevencologne •->
 
  
 
 Anmeldedatum: 19.09.2011
 Beiträge: 13
 
 
 | 
			
				|  Verfasst am: 21.09.2011 - 14:24    Titel: |   |  
				| 
 |  
				| Hi Woodpecker   
 Du bist echt klasse! Danke! ...
 
 Die Ausgabe klappt prima, es fehlt nur die Endung hinter dem Punkt. Die wirft er nun auch raus. Ansonsten passiert genau das, was ich meinte, das ist echt krass
  . Kriegst Du das mit der Endung noch hin? 
 Ich habe die Return-Anweisung mal auskommentiert und das Script laufen lassen, da bekomme ich folgende Meldung:
 
 AppleScript-Fehler
 usage: mv{-f | -i | -n] [-v] source target
 mv mv{-f | -i | -n] [-v] source ... directory
 
 ????
 
 Danke dir noch mal ganz doll!
 
 Gruss
 
 Stefan
 |  |  
		| Nach oben |  |  
		|  |  
		| woodpecker •--->
 
  
 
 Anmeldedatum: 12.10.2010
 Beiträge: 150
 Wohnort: Roggentin/Rostock
 
 | 
			
				|  Verfasst am: 21.09.2011 - 17:08    Titel: |   |  
				| 
 |  
				| Oh, das hab ich übersehen: 
 Nimm mal in der Zeile
 set tif to |Match| of me for "\\.tif$" into dir0
 
 das $-Zeichen raus, so dass es so aussieht:
 
 set tif to |Match| of me for "\\.tif" into dir0
 
 Wenn es dann nicht funktioniert, poste mal die Ausgabe von dir1.
 Bei mir sieht es jetzt so aus:
 
 {{alt:"1_7654321.tif", neu:"7654321.tif"}, {alt:"var1_1234567_neu.tif", neu:"1234567.tif"}, {alt:"var2_123456_vollseite.tif", neu:"0123456.tif"}}
 
 Gruß woodpecker
 |  |  
		| Nach oben |  |  
		|  |  
		| Skeeve •---->
 
  
  
 Anmeldedatum: 20.04.2006
 Beiträge: 1067
 
 
 | 
			
				|  Verfasst am: 21.09.2011 - 18:53    Titel: |   |  
				| 
 |  
				| Warum wird meine kurz & knapp Version ignoriert die sogar mit "Neuer Ordner" klarkommt?  _________________
 "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
 |  |  
		| Nach oben |  |  
		|  |  
		| stevencologne •->
 
  
 
 Anmeldedatum: 19.09.2011
 Beiträge: 13
 
 
 | 
			
				|  Verfasst am: 22.09.2011 - 09:38    Titel: |   |  
				| 
 |  
				| Hi Skeeve, 
 sorry, wollte Dich nicht ignorieren, bin nur nochnicht dazu gekommen
   
 Teste das gleich und melde mcih wieder ...
 
 Trotzdem schon mal danke!!!!
 
 
 Gruss
 
 Stefan
 |  |  
		| Nach oben |  |  
		|  |  
		| stevencologne •->
 
  
 
 Anmeldedatum: 19.09.2011
 Beiträge: 13
 
 
 | 
			
				|  Verfasst am: 22.09.2011 - 09:41    Titel: |   |  
				| 
 |  
				| Hi Skeeve, 
 cool! Dir auch ein fettes Danke!!!
 
 Das klappt ...
 
 
 Nun müsste es noch so sein, das die Dateinamen
 in den Dateien auch verändert werden - im Moment
 sehe ich die Änderung ja nur in der Ausgabe
   
 Ihr seid alle echt klasse!!! Danke!
 
 Gruss
 
 Stefan
 |  |  
		| Nach oben |  |  
		|  |  
		| Skeeve •---->
 
  
  
 Anmeldedatum: 20.04.2006
 Beiträge: 1067
 
 
 | 
			
				|  Verfasst am: 22.09.2011 - 19:20    Titel: |   |  
				| 
 |  
				| Das ist einfach. 
 Aber was soll geschehen, wenn der Zieldateiname existiert?
 
 Noch eine Frage: Was, wenn mehr als 7 Ziffern hintereinander stehen? Bisher würde in meiner Version die 8te und jede weitere abgeschnitten.
 
 1234567890.tif -> 1234567.tif
 _________________
 "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
 |  |  
		| Nach oben |  |  
		|  |  
		| stevencologne •->
 
  
 
 Anmeldedatum: 19.09.2011
 Beiträge: 13
 
 
 | 
			
				|  Verfasst am: 23.09.2011 - 09:47    Titel: |   |  
				| 
 |  
				| Hi Skeeve, 
 ich gehe davon aus, das wir keine doppelten Dateinamen erzeugen, da die 6 bzw. 7 stelligen Zahlen im Verzeichnis nur ein mal vor kommen. Auch mehr als 7 Ziffern kommen nicht vor, daher ist eigentlich alles chick, wenn Du mri noch verrätst, wie ich die Dateinamen ändere
   
 Gruss
 
 Stefan
 |  |  
		| Nach oben |  |  
		|  |  
		| Skeeve •---->
 
  
  
 Anmeldedatum: 20.04.2006
 Beiträge: 1067
 
 
 | 
			
				|  Verfasst am: 23.09.2011 - 15:25    Titel: |   |  
				| 
 |  
				| Versuch mal: 
  	  | Code: |  	  | set dirx to choose folder set dirx to POSIX path of dirx
 set dir to do shell script "cd " & (quoted form of dirx) & " ; perl -e " & (quoted form of "
 foreach $fname (<*>) {
 next unless -f $fname;
 next unless $fname=~ /(\\d{6,7}).*?(\\.[^\\.]+)?$/;
 $new= sprintf qq:%07d%s:, $1, $2;
 next if $new eq $fname;
 if (-e $new) {
 $r=q:existiert:;
 }
 else {
 if ( rename $fname, $new) {
 $r=q:umbenannt:;
 }
 else {
 $r=q:fehlgeschlagen:;
 }
 }
 print qq:$r\\t$fname\\t$new\\n:;
 }
 ")
 
 set dir1 to {}
 set oastid to AppleScript's text item delimiters
 set AppleScript's text item delimiters to tab
 repeat with zeile in every paragraph of dir
 set itms to text items of zeile
 copy {alt:item 2 of itms, neu:item 3 of itms, ergebnis:item 1 of itms} to end of dir1
 end repeat
 set AppleScript's text item delimiters to oastid
 dir1
 
 | 
 _________________
 "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
 |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  
 Powered by phpBB  © 2001, 2002 phpBB Group
 Deutsche Übersetzung von phpBB.de
 |  | 
 |