Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 17.06.2005 - 14:47 Titel: Rekursive Ordnererstellung |
|
|
So, einen hab' ich noch ...
Das sieht zwar wild aus, ist aber eigentlich ganz einfach - getestet ab As 1.9.3 (OS X 10.3.?), und "Tiger-sicher". Das funktioniert natürlich auch, wenn 'theFoldLst' aus nur 1 Item besteht (z.B. {"Projekt"} )
set theFoldLst to {"Projekt", ¬
{"Erste Ebene 1", ¬
{"Zweite Ebene 1", ¬
{"Dritte Ebene 1", ¬
{"Vierte Ebene 1", ¬
{"Fuenfte Ebene 1", "Fuenfte Ebene 2"}}, ¬
{"Vierte Ebene 2", "Vierte Ebene 3"}}, ¬
{"Dritte Ebene 2", "Dritte Ebene 3"}}, ¬
{"Zweite Ebene 2"}}, ¬
{"Erste Ebene 2", {"Zweite Ebene 1"}, {"Zweite Ebene 2"}}, ¬
{"Erste Ebene 3", {"Zweite Ebene 1", "Zweite Ebene 2", "Zweite Ebene 3"}} ¬
}
set thePath to (path to documents folder from user domain)
do_mkDir(thePath, theFoldLst)
-- Rekursive Ordner-Erstellung, siehe "Projektstart.scpt"
on do_mkDir(thePath, theFoldLst)
tell application "Finder"
--activate
repeat with i in theFoldLst
set temp to (contents of i)
if (class of temp = list) then
do_mkDir(theResult, temp) of me
else
if (temp = "") then error "Kein Name gefunden!" number -1728
set theResult to make new folder at thePath as alias with properties {name:temp}
end if
end repeat
end tell
end do_mkDir
_________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
Nach oben |
|
 |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 27.09.2005 - 13:58 Titel: Das ist interessant -- Idee einer "Struktursicherung&qu |
|
|
Hallo Folker,
Dein Script finde ich recht interessant. Mir schwebt jetzt vor, daraus ein Programm zu erzeugen, welches einerseits eine Ordnerstruktur aufzeichnen kann und andererseits an einen Ort eine bestehende Ordnerstruktur zurücksichern kann (auch teilweise, falls nur irgendein Unterordner gekillt wurde).
Das Programm besteht also aus drei wesentlichen Teilen:
1) DEIN Script, um die Struktur aus einer Liste zu erstellen. Das habe ich leicht verbessert, so daß es auch Hinzufügen kann (Beispiel: Jemand hat in Deiner Struktur nur einen oder mehrere Unterordner gelöscht; es werden alle fehlenden Teile hinzugefügt):
Code: | on erzeugeordner(thePath, theFoldLst) -- Original von 'Folker', http://www.fischer-bayern.de/phpBB2/viewtopic.php?t=1582
-- verbessert und erweitert von mir, Martin Wolter am 26.9.2005, 17.08 Uhr
tell application "Finder"
repeat with i in theFoldLst
set temp to (contents of i)
if (class of temp = list) then
erzeugeordner(theResult, temp) of me
else
try
set theResult to make new folder at thePath as alias with properties {name:temp}
on error -- © by MW! So funktioniert auch ein Hinzufügen! 26.9.2005, 17.08 Uhr
set theResult to folder temp of thePath
end try
end if
end repeat
end tell
end erzeugeordner
|
So. Teil 2 ist, daß die Daten universell gesichert werden -- also es muß eine Möglichkeit geben, Deine Ursprungsliste
Code: | set theFoldLst to {"P", {"Fuenfte Ebene 1", "Fuenfte Ebene 2"}, {"Vierte Ebene 1", "Vierte Ebene 2", "Vierte Ebene 3"}, {"Dritte Ebene 1", "Dritte Ebene 2", "Dritte Ebene 3"}, {"Zweite Ebene 1", "Zweite Ebene 2"}, {"Zweite Ebene 1", "Zweite Ebene 2"}, {"Zweite Ebene 1", "Zweite Ebene 2", "Zweite Ebene 3"}, {"Erste Ebene 1", "Erste Ebene 2", "Erste Ebene 3"}}
|
in eine externe Textdatei zu sichern. Diesen Teil habe ich mir komplett erzeugt -- er erzeugt aus einer Listenvariable einen Textstring, der genauso aussieht:
Code: |
on listeintextwandeln(liste, ioe) -- ioe = intern "i" oder extern "e" sorgt für Hinzufügen am Ende von "}, " (erweiterbar) bzw. "}" (endgültig geschlossen)
-- erstellt am 26.9.2005, fertiggestellt nach vielem Tüfteln am 27.9.2005, 0.56 Uhr
if ioe is "e" then
set textliste to "{"
else if ioe is "i" then
set textliste to ", {"
end if
set anz to count items of liste
repeat with i from 1 to anz
set temp to (contents of item i of liste)
if (class of temp = list) then
set textliste to textliste & (listeintextwandeln(temp, "i") of me)
else
if i is not anz and ioe is "i" then
set trenner to ", "
else
set trenner to ""
end if
set textliste to textliste & "\"" & item i of liste & "\"" & trenner
end if
end repeat
set textliste to textliste & "}"
set textliste to my austauschen(", , ", ", ", textliste)
return textliste
end listeintextwandeln
on ergebnislisteproduzieren() -- liest von Zwischenablage; wandelt eine Liste als string in eine Listenvariable um, 27.9.2005, 1.10 Uhr
set ergebnisliste to "set ergebnisliste to " & (the clipboard)
set ergebnisliste to (run script ergebnisliste)
return ergebnisliste
end ergebnislisteproduzieren
on austauschen(suchen, Ersetzen, urtext)
set my text item delimiters to (suchen)
tell me to set theList to (every text item of urtext)
set my text item delimiters to (Ersetzen)
set urtext to theList as string
return urtext
end austauschen
set the clipboard to (my listeintextwandeln(liste, "e"))
my ergebnislisteproduzieren() |
So, der dritte Teil wäre das, wo ich zur Zeit scheitere: Ebenfalls ein rekursiver Handler muß eine Ordnerstruktur durchgehen und so eine Liste erzeugen, wie Du sie aufgeführt hast.
Wenn Du da etwas wüßtest, dann wäre es mit leichten Änderungen (Hinzufügen von Sichern- und Lesenfunktion) möglich, ein Programm zu erstellen, welches eine komplizierte Ordnerstruktur sich einliest (intern in eine Liste verwandelt und diese Liste als kleinen Textstring abspeichert) und als zweiten Schritt einen String einliest, diesen in eine Liste verwandelt und dann mittels ersten Teil diese Struktur irgendwo erzeugen kann.
Ich fände so ein Programm sehr hilfreich. _________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
Jürgen Venne •->


Anmeldedatum: 19.08.2005 Beiträge: 14 Wohnort: 46519 Alpen-Veen
|
Verfasst am: 28.09.2005 - 07:57 Titel: Ordnerstruktur einlesen und wieder neu erzeigen |
|
|
Hallo Folker, hallo Martin,
wir sind hier ja im Applescript-Forum und nicht im "Shell-Script-Forum", aber die Ansätze scheinen mir doch sehr kompliziert. Das lässt sich mit einfachsten Shell-Mitteln besser (und schneller) lösen.
Das folgende Applescript liest eine Ordnerstruktur ein, speichert diese in einer Variablen ab, die wiederum in eine Textdatei geschieben wird.
Danach wird die Textdatei wieder eingelesen und die Ordner daraus neu erzeugt.
Code: | --Startpfad setzen
set thePath to POSIX path of ((path to documents folder from user domain) as text)
--Alle enthaltenen Ordner einlesen
set eingelesenestruktur to do shell script "cd " & quoted form of thePath & "; find * -type d | grep -v \\.app"
--eingelesene Struktur in eine Textdatei sichern
do shell script "echo '" & eingelesenestruktur & "' >'" & thePath & "struktur.txt'"
--Die Struktur aus der Textdatei wieder auslesen und ggf. Ordner neu erzeugen
set struktur to do shell script "cat '" & thePath & "struktur.txt'"
--Struktur in eine Liste aus einzelnen Zeilen wandeln
set olddelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to return
set struktur to every text item of struktur
set AppleScript's text item delimiters to olddelim
--Alle Ordner wieder anlegen
repeat with s in struktur
--log "mkdir '" & thePath & s & "'"
try
do shell script "mkdir '" & thePath & s & "'"
end try
end repeat |
Viele Grüße aus Geldern
Jürgen Venne
P. S. Martin, wir sehen uns ja gleich!
Zuletzt bearbeitet von Jürgen Venne am 04.10.2005 - 12:15, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 02.10.2005 - 12:35 Titel: |
|
|
Hallo Jürgen,
interessehalber habe ich dein Skript mal laufen lassen.
Es läuft aber nicht voll durch.
Beim Sichern der Struktur in eine Textdatei kommt folgende Anzeige im Eventprotokoll:
"Der Befehl wurde mit einem Ergebins ungleich Null beendet."
D.h. es muss irgendein Fehler aufgetreten sein.
Was mir noch aufgefallen ist: Alle Programm-Bundles werden als Ordner erkannt und somit auch katalogisiert. Kann man die noch irgendwie ausklammern? _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com |
|
Nach oben |
|
 |
Jürgen Venne •->


Anmeldedatum: 19.08.2005 Beiträge: 14 Wohnort: 46519 Alpen-Veen
|
Verfasst am: 04.10.2005 - 12:11 Titel: |
|
|
Hallo Snow,
ich hab das Script oben korrigiert.
In der Zeile
Code: | set eingelesenestruktur to do shell script "cd " & quoted form of thePath & "; find * -type d | grep -v \\.app"
|
werden jetzt durch das angefügte "grep" mit der Option "-v" alle Application-Bundles ignoriert - freilich auch alle Ordner in denen ein ".app" vorkommt
Deine Fehlermeldung hab ich zwar nicht reproduzieren können, ich denke, es liegt aber an fehlenden einfachen Anführungszeichen in der Zeile
Code: | --eingelesene Struktur in eine Textdatei sichern
do shell script "echo '" & eingelesenestruktur & "' >'" & thePath & "struktur.txt'"
|
Dadurch wird verhindert, dass Ordnernamen, die für Unix ungültige Zeichen enthalten (z.B. ><) den Ablauf stoppen.
Ich hoffe es läuft jetzt vernünftig, ich muss zugeben das durch die kürze des Scripts auch keine Fehler abgefangen werden. _________________ Viele Grüße
Jürgen Venne |
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 21.04.2006 - 00:53 Titel: |
|
|
Jürgen Venne hat Folgendes geschrieben: |
Code: | set eingelesenestruktur to do shell script "cd " & quoted form of thePath & "; find * -type d | grep -v \\.app"
|
|
Das läßt sich reduzieren auf:
Code: | set eingelesenestruktur to do shell script "cd " & quoted form of thePath & "; find * -type d -not \\( -name \\*.app -and -prune \\)"
|
"reduzieren" im Sinne von: Ein programm weniger aufzurufen. |
|
Nach oben |
|
 |
pret •->

Anmeldedatum: 29.07.2007 Beiträge: 1
|
Verfasst am: 29.07.2007 - 21:16 Titel: |
|
|
So das erste Problem ist gelöst.... gibt es in Applescript eine Möglichkeit einen Startpunkt für die Variable "choose folder with prompt" zu setzen? |
|
Nach oben |
|
 |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 29.07.2007 - 23:05 Titel: |
|
|
Hallo pret,
das ist kein Problem.
Code: | set bilderordnermacpfad to choose folder with prompt "Ordner wählen (alter Ort war hier)" default location bilderordnermacpfad without invisibles
|
Das als Beispiel. Also geht es mit default location. Damit Du diese nutzen kannst, gibst Du Deinem Programm am Besten eine property:
Code: | property bilderordnermacpfad : alias |
Darin ist dann beim ersten Aufruf nichts gespeichert (Fehler mußt Du abfangen), ab dem zweiten Aufruf dann stehst Du jeweils beim letztbesuchten Ort. _________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
sdenjuopl148 •---->

Anmeldedatum: 17.12.2022 Beiträge: 725 Wohnort: New York city
|
|
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
|
|
|