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

Rekursive Ordnererstellung

 
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> OS X-Snippets
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 17.06.2005 - 14:47    Titel: Rekursive Ordnererstellung Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 27.09.2005 - 13:58    Titel: Das ist interessant -- Idee einer "Struktursicherung&qu Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jürgen Venne
•->
•->


Anmeldedatum: 19.08.2005
Beiträge: 14
Wohnort: 46519 Alpen-Veen

BeitragVerfasst am: 28.09.2005 - 07:57    Titel: Ordnerstruktur einlesen und wieder neu erzeigen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1955
Wohnort: Deiningen

BeitragVerfasst am: 02.10.2005 - 12:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
Jürgen Venne
•->
•->


Anmeldedatum: 19.08.2005
Beiträge: 14
Wohnort: 46519 Alpen-Veen

BeitragVerfasst am: 04.10.2005 - 12:11    Titel: Antworten mit Zitat

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 Sad

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 21.04.2006 - 00:53    Titel: Antworten mit Zitat

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


Anmeldedatum: 29.07.2007
Beiträge: 1

BeitragVerfasst am: 29.07.2007 - 21:16    Titel: Antworten mit Zitat

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


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 29.07.2007 - 23:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> OS X-Snippets Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
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