[GastForen Programmierung/Entwicklung AppleScript Applescript: Dateien in verschiedene Ordner kopieren

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

Applescript: Dateien in verschiedene Ordner kopieren

salvis
Beiträge gesamt: 21

29. Jan 2015, 19:45
Beitrag # 1 von 31
Bewertung:
(16928 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Zusammen

Ich möchte verschieden PDfs (Bsp. Datei_Name001, Datei_Name002, ...) in eine Ordnerstruktur (001, 002, 003) kopieren.

Könnt Ihr mir da helfen?
Ich stelle mir das so vor:

1. Quellordner der PDF-Dateien auswählen
2. Zielordner der Ordnerstruktur auswählen
3. Die Dateien mit gleicher Nummer im Namen 001 werden nun in Ordner mit Ordnernamen 001 kopiert, usw.

Danke für ein Feedback.

(Dieser Beitrag wurde von salvis am 29. Jan 2015, 19:46 geändert)
X

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

29. Jan 2015, 20:37
Beitrag # 2 von 31
Beitrag ID: #536458
Bewertung:
(16891 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo salvis,

herzlich willkommen im AppleScript-Forum auf HDS! :-)

Diese Aufgabe sollte zu lösen sein. Eventuell auch mit einem Droplet, damit die Wahl des Quellordners einfacher ist.

Drei Fragen:
– Sind alle PDF-Dateien mit dem Suffix ".pdf" versehen?
– Sind im Zielordner alle notwendigen Ordner schon vorhanden?
– Welche Version von Mac OS X ist im Einsatz?

Gruss, Hans


als Antwort auf: [#536454]

Applescript: Dateien in verschiedene Ordner kopieren

salvis
Beiträge gesamt: 21

30. Jan 2015, 06:37
Beitrag # 3 von 31
Beitrag ID: #536476
Bewertung:
(16851 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans

Ich habe mit einem Apple-Script aus ca. 500 pdf-Dateien, 500 Ordner mit dem Namen der pdf-Dateien generiert und die Dateien jeweils dorthin verschieben lassen.
Nun habe ich wiederum ca. 500 andere PDF Dateien, die die Nummer des Ordnernamen beinhalten. (alles PDFs, die automatisch aus einem Exceldokument erstellt wurden)

OS X Version ist 10.9

Danke für ein Feedback.


Antwort auf [ Hans Haesler ] Hallo salvis,

herzlich willkommen im AppleScript-Forum auf HDS! :-)

Diese Aufgabe sollte zu lösen sein. Eventuell auch mit einem Droplet, damit die Wahl des Quellordners einfacher ist.

Drei Fragen:
– Sind alle PDF-Dateien mit dem Suffix ".pdf" versehen?
– Sind im Zielordner alle notwendigen Ordner schon vorhanden?
– Welche Version von Mac OS X ist im Einsatz?

Gruss, Hans



als Antwort auf: [#536458]

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

30. Jan 2015, 08:06
Beitrag # 4 von 31
Beitrag ID: #536477
Bewertung:
(16824 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo salvis,

ich habe schon ein Droplet geschrieben. Aber bevor ich es freigebe:
– Sind alle PDF-Dateien mit dem Suffix ".pdf" versehen?
– Sollen die Dateien kopiert oder verschoben werden?

Und eine Bitte: Beim Antworten nicht den ganzen Text des Vorredners wiederholen. :-)

Gruss, Hans


als Antwort auf: [#536476]

Applescript: Dateien in verschiedene Ordner kopieren

salvis
Beiträge gesamt: 21

30. Jan 2015, 12:11
Beitrag # 5 von 31
Beitrag ID: #536495
Bewertung:
(16752 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans
Genial.

– Sind alle PDF-Dateien mit dem Suffix ".pdf" versehen?
>> Ja

– Sollen die Dateien kopiert oder verschoben werden?
>> verschoben

Gruss, Salvis


als Antwort auf: [#536477]

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

30. Jan 2015, 13:03
Beitrag # 6 von 31
Beitrag ID: #536497
Bewertung:
(16737 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Salvis,

okay. Dann speichere bitte den folgenden Code im Dateiformat "Programm".
Das ergibt ein Droplet, auf dessen Icon Du den Quellordner (oder einzelne oder mehrere Dateien) ziehen kannst.
Als nächstes öffnet sich ein Auswahldialog, in welchem der Zielordner gewählt werden muss.

Code
(*  
DateienKopieren_01d.app
Dieses Script kopiert Dateien in entsprechende Ordner des Zielordners
aufgrund der drei Ziffern am Schluss der Datei-Namen
© 29.01.15 / Hans Häsler, Châtelard 52, CH-1018 Lausanne
*)

global targetFolder

-- einen Dialog zeigen, falls der Anwender einen Doppelklick auf das Droplet macht
on run
display dialog "Ordner oder Dateien auf dem Icon
dieses Droplets deponieren." buttons "OK" default button 1 with icon 0
end run

-- der 'open handler', welcher auf das Fallenlassen von Objekten reagiert
on open allObjects
set targetFolder to (choose folder with prompt "Den Zielordner wählen") as Unicode text
set AppleScript's text item delimiters to " "
-- Wiederholschleife, welche die gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat
set AppleScript's text item delimiters to {""}
-- den Anwender informieren
display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
end open

-- im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist;
-- bei Ordnern wird eine Liste des Inhalts erstellt und die Elemente rekursiv behandelt
-- (d.h. zum aktuellen Handler geschickt). Dateien werden zum Handler 'processFile' gesandt.
on processObject(aObject)
-- wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner
if (aObject as string) ends with ":" then
-- die Liste des Inhalts wird erstellt (ohne unsichtbare Dateien)
set contentsList to list folder aObject without invisibles

-- dies ist das rekursive Teil: die Wiederholschleife schickt alle Objekte zum Handler,
-- in welchem sie sich selbst befindet
repeat with anItem in contentsList
set objPath to ((aObject as Unicode text) & anItem)
processObject(objPath as alias)
end repeat

-- wenn das Objekt eine Datei ist ...
else
tell application "Finder"
-- den Namen der Datei ...
set fullName to name of file aObject
end tell
-- ... dann werden die Pfade und der Dateiname dem Handler 'processFile' übergeben
processFile(aObject, fullName)
end if
end processObject

-- die aktuelle Datei behandeln
on processFile(aObject, fullName)
-- den Ordnernamen ausziehen
set folName to text -7 thru -5 of fullName
-- und auch den vollen Pfad zum Unterordner
set curFolder to targetFolder & folName
tell application "Finder"
-- wenn der Ordner nicht vorhanden ist ...
if not (exists curFolder) then
-- den Ordner erzeugen
make new folder at targetFolder with properties {name:folName}
end if
-- die aktuelle Datei hineinkopieren
try
move file aObject to curFolder with replacing
end try
end tell
end processFile

Ich hoffe, dass es damit klappen wird. Hier funktioniert es.
Bedingung ist, dass sich die drei Ziffern immer an derselben Stelle befinden.

Gruss, Hans


als Antwort auf: [#536495]

Applescript: Dateien in verschiedene Ordner kopieren

salvis
Beiträge gesamt: 21

30. Jan 2015, 14:55
Beitrag # 7 von 31
Beitrag ID: #536502
Bewertung:
(16696 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Soweit super!

Es funktioniert grundsätzlich.
Noch zwei Fragen-
1.
Wo kann ich festlegen wie viele Stellen er aus dem Dateinamen ausliesst? Also die letzen 7 Stellen vor dem Punkt
Konkret ist der Dateiname: ABC_Raumdetailblatt_Raum-CG-0006.pdf
Der Ordner sollte dann den Namen CG-0006 haben.

2. Kann die Ordnerstruktur nach dem Ordnernamen durchsucht werden. Dieser Ordner (Bsp. CG-0006) Kann aber in einem Unterordner sein. Dort sollte dann die Datei abgelegt werden.
Da es dann ggf. ein Problem mit Dateien gibt, wo kein Ordner mit Namen existiert. Könnte die Datei im Ausgangsort liegen bleiben. Dann sieht man welcher Ordner ggf. fehlt.

Gruss salvis


als Antwort auf: [#536454]

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

30. Jan 2015, 15:32
Beitrag # 8 von 31
Beitrag ID: #536504
Bewertung:
(16689 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Salvis,

bin gerade unterwegs. Werde mich später melden.

Gruss, Hans


als Antwort auf: [#536502]

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

31. Jan 2015, 16:06
Beitrag # 9 von 31
Beitrag ID: #536561
Bewertung:
(16587 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Salvis,

gut, dass es funktioniert und super ist! :-)

Zu 1.:
Die Anzahl Zeichen sowie die Position wird in folgender Zeile definiert:

Code
-- den Ordnernamen ausziehen  
set folName to text -7 thru -5 of fullName

Die Ziffern mit dem Minuszeichen beziehen sich auf die Position.
Das allerletzte Zeichen des Dateinamens, das "f" (von .pdf) wird mit -1 adressiert.
Der Punkt hat die Position -4.
Der Befehl bedeutet also: Weise der Variablen 'folName' den Text -7 bis -5 des Dateinamens zu.

Mit dem Beispiel "ABC_Raumdetailblatt_Raum-CG-0006.pdf" wäre das "006".
Wie die ursprüngliche Anforderung lautete ...

Mit sieben Zeichen ist der Befehl:

Code
-- den Ordnernamen ausziehen  
set folName to text -11 thru -5 of fullName

Ergebnis: "CG-0006"

Zu 2.:
Das ist schon schwieriger. Zunächst aber eine Erklärung, was mit dem ersten Droplet geschieht, wenn sich ein gewünschter Ordner nicht im Zielordner befindet. Dann wird er ganz einfach erzeugt:

Code
-- wenn der Ordner nicht vorhanden ist ... 
if not (exists curFolder) then
-- den Ordner erzeugen
make new folder at targetFolder with properties {name:folName}
end if

Diesen Abschnitt kann man natürlich entsprechend ändern, damit der aktuelle Ordner in den Unterordnern gesucht wird.

Wenn ich es richtig verstehe, dann liegen im gewählten Zielordner Unterordner welche z.B. mit "CG" benannt sind (oder "001"?). Und diese Unterordner müssen nun durchsucht werden. Wenn dabei der richtige Ordner gefunden ist, wird die Datei verschoben.

Ist aber kein solcher Ordner vorhanden, dann wird die Datei nicht verschoben und bleibt im Quellordner liegen.

Noch eine Erklärung der Verschieben-Zeile:

Code
try 
move file aObject to curFolder with replacing
end try

Da wird versucht (der 'try'-Wickel sorgt dafür), die Datei zu verschieben. Ist sie aber schon am Zielort vorhanden, dann wird diese beim Verschieben durch die neue ersetzt.
Ist dieses Verhalten nicht erwünscht, dann 'with replacing' entfernen, aber den 'try'-Wickel lassen. Eine vorhandene Datei verursacht dann eine Fehlermeldung, welche aber vom 'try'-Wickel unterdrückt wird. Und die Datei wird nicht verschoben.

Im nächsten Beitrag wird versucht, eine Lösung zum Durchsuchen der Unterordner zu finden.

Gruss, Hans


als Antwort auf: [#536502]

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

31. Jan 2015, 16:17
Beitrag # 10 von 31
Beitrag ID: #536562
Bewertung:
(16585 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
****
Dann halt die Ordner-Struktur durchwandern, bei jedem Ordner die darin enthaltenen Ordner auflisten und bei jedem wieder prüfen, ob er Ordner enthält. Das gelingt am besten mit einer rekursiven Konstruktion. Da wird immer wieder die Funktion (= getFolders) aufgerufen, in welcher sich der Aufruf befindet:

Code
property allPaths : {} 

set targetFolder to (choose folder)

getFolders(targetFolder)

on getFolders(targetFolder)
tell application "Finder"
set folderList to every folder in targetFolder
repeat with curSubfolder in folderList
set end of allPaths to curSubfolder as Unicode text
my getFolders(curSubfolder)
end repeat
end tell
end getFolders

allPaths

Diese Liste wird natürlich gleich zu Beginn erzeugt. Und nicht jedes Mal bei jeder zu verschiebenden Datei.

Aber jetzt muss man diese Liste durchgehen und prüfen, ob sich der aktuelle Ordnername darin befindet. Dazu werden die 'AppleScript's text item delimiters' als Doppelpunkt definiert. Weil jedes Element mit einem Doppelpunkt endet, muss man das zweitletzte 'text item' prüfen:

Code
set AppleScript's text item delimiters to {":"} 
repeat with n from 1 to count of allPaths
set curFolder to item n of allPaths
if text item -2 of curFolder is folName then
try
move file aObject to folder curFolder with replacing
end try
exit repeat
end if
end repeat
set AppleScript's text item delimiters to {""}

Dieses Snippet – im Droplet an der richtigen Stelle eingefügt – funktioniert. Aber: Mit einer grossen Anzahl von Ordnern wird das ziemlich langsam sein.

*****
Es muss also eine Methode her, mit welcher der passende Pfad in der Auflistung direkter gefunden werden kann.

Die Idee: Gleichzeitig einer zweiten Liste nur die Namen der Ordner zuweisen ...

Code
set end of allNames to name of curSubfolder 

... und dann mit einer speziellen Methode die Position des gewünschten Ordners feststellen und den entsprechenden Pfad in der anderen Liste holen.
Das klingt kompliziert, würde aber sehr schnell ausgeführt. Doch das Auflisten der Pfade zu Beginn würde schon etwas dauern.

*****
Deshalb: Für ein gezieltes Finden des End-Ordners scheint der Shell-Befehl mdfind sehr geeignet zu sein. Mit der Option '-onlyin' wird die Suche auf den gewählten Zielordner eingeschränkt.

Code
set targetFolder to (choose folder with prompt "Den Zielordner wählen") as Unicode text 
set folName to "CG-0006"

set curFolder to do shell script "mdfind -onlyin '" & POSIX path of targetFolder & "' -name '" & folName & "'"

set tmpPath to POSIX file curFolder

So wird sehr schnell der POSIX-Pfad des Ordners "CG-0006" gefunden. In der letzten Zeile wird das Ergebnis in einen HFS-Pfad verwandelt, damit der "Finder" etwas damit anfangen kann.

Der grosse Nachteil dieser Methode: Wenn in der Struktur schon eine Datei liegt, welche denselben Namen hat, dann wird der Pfad dieser Datei ebenfalls gefunden. Und das Ergebnis ist nicht etwa mit einem Trenner versehen: Alles ist in einer Textkette.

Ich habe nun versucht, dennoch an den Ordnerpfad zu kommen, welcher uns interessiert. Zu sehen in der Version 02 des Droplets, im nächsten Beitrag.


als Antwort auf: [#536561]

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

31. Jan 2015, 16:20
Beitrag # 11 von 31
Beitrag ID: #536563
Bewertung:
(16584 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Und hier die Version 02d des Droplets:

Der Trick, um das Ergebnis dennoch aufteilen zu können: Den text item delimiters wird ":Users:" zugewiesen. Das ist der gemeinsamme Nenner der Einträge. Dann eine Schleife durch die Elemente. Wenn das aktuelle mit dem Namen des Ordners endet, dann wird das erste Element (der Name der Harddisk) und ":Users:" vorangestellt und zurück zum Handleraufruf geschickt.

Code
(*  
DateienKopieren_02d.app
Dieses Script verschiebt Dateien in entsprechende Ordner des Zielordners
aufgrund der sieben Zeichen am Schluss der Datei-Namen
© 31.01.15 / Hans Häsler, Châtelard 52, CH-1018 Lausanne
*)

global targetFolder

-- einen Dialog zeigen, falls der Anwender einen Doppelklick auf das Droplet macht
on run
display dialog "Ordner oder Dateien auf dem Icon
dieses Droplets deponieren." buttons "OK" default button 1 with icon 0
end run

-- der 'open handler', welcher auf das Fallenlassen von Objekten reagiert
on open allObjects
-- den Anwender auffordern, den Zielordner zu wählen
set targetFolder to (choose folder with prompt "Den Zielordner wählen")
-- Wiederholschleife, welche die gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat
set AppleScript's text item delimiters to {""}
-- den Anwender informieren
display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
end open

-- im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist;
-- bei Ordnern wird eine Liste des Inhalts erstellt und die Elemente rekursiv behandelt
-- (d.h. zum aktuellen Handler geschickt). Dateien werden zum Handler 'processFile' gesandt.
on processObject(aObject)
-- wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner
if (aObject as string) ends with ":" then
-- die Liste des Inhalts wird erstellt (ohne unsichtbare Dateien)
set contentsList to list folder aObject without invisibles

-- dies ist das rekursive Teil: die Wiederholschleife schickt alle Objekte zum Handler,
-- in welchem sie sich selbst befindet
repeat with anItem in contentsList
set objPath to ((aObject as Unicode text) & anItem)
processObject(objPath as alias)
end repeat

-- wenn das Objekt eine Datei ist ...
else
tell application "Finder"
-- den Namen der Datei ...
set fullName to name of file aObject
end tell
-- ... dann werden die Pfade und der Dateiname dem Handler 'processFile' übergeben
processFile(aObject, fullName)
end if
end processObject

-- die aktuelle Datei behandeln
on processFile(aObject, fullName)
-- den Ordnernamen ausziehen
set folName to text -11 thru -5 of fullName
-- und auch den vollen Pfad zum Unterordner
set curFolder to (targetFolder & folName) as string
tell application "Finder"
-- wenn der Ordner vorhanden ist ...
if (exists curFolder) then
-- ... versuchen, die aktuelle Datei hineinzuverschieben
try
move file aObject to folder curFolder with replacing
end try
else
-- sonst den Handler aufrufen, welcher auch die Unterordner mit einbezieht
set curFolder to my getPath(targetFolder, folName)
if curFolder is not "" then
tell application "Finder"
try
move file aObject to folder curFolder with replacing
end try
end tell
end if
end if
end tell
end processFile

on getPath(targetFolder, folName)
set curFolder to do shell script "mdfind -onlyin '" & POSIX path of targetFolder & "' -name '" & folName & "'"
try
set tmpPath to POSIX file curFolder
on error
return ""
end try
set pathString to tmpPath as Unicode text

set AppleScript's text item delimiters to ":Users:"
set sepItems to every text item of pathString
set nItems to count sepItems
if nItems is 1 then
return ""
else if nItems is 2 then
return pathString
else
repeat with n from 2 to nItems
set curItem to item n of sepItems
if curItem ends with (":" & folName) then
tell application "Finder"
set curPath to (item 1 of sepItems & ":Users:" & curItem)
end tell
set AppleScript's text item delimiters to {""}
return curPath
end if
end repeat
end if
end getPath

Mit meiner einfachen Ordnerstruktur funktioniert es. Die Dateien werden wie erwartet verschoben.

Gruss, Hans


als Antwort auf: [#536562]

Applescript: Dateien in verschiedene Ordner kopieren

salvis
Beiträge gesamt: 21

1. Feb 2015, 21:20
Beitrag # 12 von 31
Beitrag ID: #536583
Bewertung:
(16458 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans

Ich bin beeindruckt. Auch wenn ich nur einen Teil wirklich verstehe, habe ich es grundsätzlich zum laufen bekommen.
Leider funktioniert es nur, wenn ich als Zielordner den Ordner auswähle, wo auch die Ordner (z.B. CG-1008) direkt drinnen liegen. Wenn ich einen Ordner weiter oben auswähle, kommt folgende Meldung:

Die Variable ”curFolder" ist nicht definiert. (-2753)

Kannst du damit etwas anfangen?

Gruss salis


als Antwort auf: [#536563]

Applescript: Dateien in verschiedene Ordner kopieren

Hans Haesler
  
Beiträge gesamt: 5826

1. Feb 2015, 22:13
Beitrag # 13 von 31
Beitrag ID: #536585
Bewertung:
(16431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Salvis,

weshalb es bei Dir nicht klappen will ist mir nicht klar.

In meiner "Testumgebung" habe ich diese Ordnerstruktur:

Code
Zielordner 
001
CG-0001
002
CG-0002
003
CG-0003
004
CG-0004
CG-0005
CG-0006
CG-0007

Und die Dateien werden zuverlässig in die erwarteten Ordner verschoben.

Und jetzt habe ich den Ordner "Zielordner" in den neuen Ordner "Hauptordner" verschoben, diesen ausgewählt, den Ordner "Quellordner" auf das Icon des Droplets gezogen und es funktioniert immer noch wie vorgesehen.

Zeige uns doch bitte einen Screenshot, aus welchem hervorgeht, wie bei Dir die Ordnerstruktur aussieht. Dann muss ich nicht mehr raten ...

Gruss, Hans


als Antwort auf: [#536583]

Applescript: Dateien in verschiedene Ordner kopieren

salvis
Beiträge gesamt: 21

1. Feb 2015, 22:35
Beitrag # 14 von 31
Beitrag ID: #536586
Bewertung:
(16423 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
ABC_Raumbuch
/ABC_CA
//ABC_14-12-15_GR_0050_CA_1OG
///CA-1600
///CA-1601
///CA-1602
///CA-1605
///CA-1606
///CA-1608
///CA-1610
///CA-1612
//ABC_14-12-15_GR_0050_CA_EG
///CA-0010
///CA-0012
///CA-0600
///CA-0601
///CA-0610
///CA-0612
///Legende
/ABC_CG
//ABC_14-12-15_GR_0050_CG_1OG
///CG-1006
///CG-1007
///CG-1008
///CG-1010
//ABC_14-12-15_GR_0050_CG_1UG
///CG-A010
///CG-A020
///CG-A102
///CG-A130

usw


als Antwort auf: [#536585]
(Dieser Beitrag wurde von salvis am 1. Feb 2015, 22:38 geändert)

Applescript: Dateien in verschiedene Ordner kopieren

salvis
Beiträge gesamt: 21

1. Feb 2015, 23:03
Beitrag # 15 von 31
Beitrag ID: #536588
Bewertung:
(16400 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe die Ordnerstruktur auch stark vereinfacht. Funktioniert trotzdem leider nicht.


als Antwort auf: [#536586]
X