Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Zahlenkolone im Dateinamen erkennen und Rest löschen
Gehe zu Seite 1, 2  Weiter
 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
stevencologne
•->
•->


Anmeldedatum: 19.09.2011
Beiträge: 13

BeitragVerfasst am: 19.09.2011 - 16:52    Titel: Zahlenkolone im Dateinamen erkennen und Rest löschen Antworten mit Zitat

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 Smile

Danke und Gruss

Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
woodpecker
•--->
•--->


Anmeldedatum: 12.10.2010
Beiträge: 150
Wohnort: Roggentin/Rostock

BeitragVerfasst am: 20.09.2011 - 09:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
stevencologne
•->
•->


Anmeldedatum: 19.09.2011
Beiträge: 13

BeitragVerfasst am: 20.09.2011 - 10:53    Titel: Antworten mit Zitat

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 Wink

Kriegt man das noch in den Griff? Ich hoffe, es ist nicht unverschämt, wenn ich das so frage Smile)))))))))))))
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
woodpecker
•--->
•--->


Anmeldedatum: 12.10.2010
Beiträge: 150
Wohnort: Roggentin/Rostock

BeitragVerfasst am: 20.09.2011 - 15:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1067

BeitragVerfasst am: 20.09.2011 - 21:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
stevencologne
•->
•->


Anmeldedatum: 19.09.2011
Beiträge: 13

BeitragVerfasst am: 21.09.2011 - 11:08    Titel: Antworten mit Zitat

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 Smile

Gruss

Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
woodpecker
•--->
•--->


Anmeldedatum: 12.10.2010
Beiträge: 150
Wohnort: Roggentin/Rostock

BeitragVerfasst am: 21.09.2011 - 14:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
stevencologne
•->
•->


Anmeldedatum: 19.09.2011
Beiträge: 13

BeitragVerfasst am: 21.09.2011 - 14:24    Titel: Antworten mit Zitat

Hi Woodpecker Smile

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 Smile. 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
Benutzer-Profile anzeigen Private Nachricht senden
woodpecker
•--->
•--->


Anmeldedatum: 12.10.2010
Beiträge: 150
Wohnort: Roggentin/Rostock

BeitragVerfasst am: 21.09.2011 - 17:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1067

BeitragVerfasst am: 21.09.2011 - 18:53    Titel: Antworten mit Zitat

Warum wird meine kurz & knapp Version ignoriert die sogar mit "Neuer Ordner" klarkommt? Wink
_________________
"All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
stevencologne
•->
•->


Anmeldedatum: 19.09.2011
Beiträge: 13

BeitragVerfasst am: 22.09.2011 - 09:38    Titel: Antworten mit Zitat

Hi Skeeve,

sorry, wollte Dich nicht ignorieren, bin nur nochnicht dazu gekommen Smile

Teste das gleich und melde mcih wieder ...

Trotzdem schon mal danke!!!!


Gruss

Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
stevencologne
•->
•->


Anmeldedatum: 19.09.2011
Beiträge: 13

BeitragVerfasst am: 22.09.2011 - 09:41    Titel: Antworten mit Zitat

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 Smile

Ihr seid alle echt klasse!!! Danke!

Gruss

Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1067

BeitragVerfasst am: 22.09.2011 - 19:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
stevencologne
•->
•->


Anmeldedatum: 19.09.2011
Beiträge: 13

BeitragVerfasst am: 23.09.2011 - 09:47    Titel: Antworten mit Zitat

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 Smile

Gruss

Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1067

BeitragVerfasst am: 23.09.2011 - 15:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum Alle Zeiten sind GMT + 2 Stunden
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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


AppleScript für absolute Starter