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
|
|
|