Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Software>App für Erstellung eines Abbildeds einer komplexen Ordnerstruktur

App für Erstellung eines Abbildeds einer komplexen Ordnerstruktur

killerspots10.11.2210:40
Moin,

ich bin auf der Suche nach einer Mac-App, die mir ein Abbild einer Ordner- und Dateistruktur erstellen kann, ohne dass die Einzeldateien enthalten sind. Es geht also wirklich nur um das Abbilden einer komplexen Ordnerstruktur mit allen Unterordnern.
Im besten Falle kann man diese Struktur dann als PDF speichern und verschicken.
Mir wurde mal gesagt, dass der Fachbegriff für diesen Vorgang "Folder Shadowing" ist. Stimmt das?

Ich freue mich über eure Ideen.
0

Kommentare

ssb
ssb10.11.2210:57
Für diesen Zweck würde ich ein kleines Pythonskript verwenden, dass entweder die Ordnerstruktur als Text-Datei ausgibt (als PDF verschicken?) oder eben die Ordner entsprechend des Musterordners erstellt.
Einen kleinen Tree-Walker mit entsprechender Rekursion.

Wenn es darum geht, dass der Empfänger des verschickten PDFs die Ordnerstruktur nachbauen kann, könnte man gleich ein entsprechendes Skript erzeugen lassen. Aber ein ZIP der Ordnerstruktur zu verschicken, wäre für den Empfänger vermutlich einfacher.

Aber ich bin mir sicher, dass man das auch mit einem Shell-Befehl lösen kann, irgendwas mit "find" auf die Schnelle geschätzt. Eventuell den Ordner 1:1 kopieren und dann mit find alle Dateien löschen und nur Ordner stehen lassen. Das wäre dann ein 1-Zeiler. Es gibt ja ein paar Shell-Cracks hier.

Wenn sich keiner meldet, könnte ich das später mal versuchen (also einer der beiden Wege).
+1
s-cope10.11.2211:00
Vielleicht macht dies App, was Du willst. (FolderToList)
http://www.torellasw.com/Torella_software/FolderToList.html
+2
marm10.11.2211:17
Nifty File List kann Ordnerstrukturen in mehreren Dateiformaten sichern. Gefiltert, sortiert, formatiert, ...
Wenn Du die echten Ordner benötigst, kann auf Basis der csv-Tabelle ein Script erstellt werden.
+2
MrChad10.11.2218:21
Gerade zufällig gesehen:

Zwei simple Optionen im Terminal
1- über einen zsh-Alias
2- "tree" nach Wahl über Homebrew/MacPorts

https://osxdaily.com/2016/09/09/view-folder-tree-terminal-mac-os-tree-equi...

(und das Ergebnis kann man sich im Textprogramm seiner Wahl "schön" machen)
+1
macuser11
macuser1111.11.2200:42
FilelistCreator (DateilistenSchreiber):
+3
killerspots24.11.2222:26
ssb
Für diesen Zweck würde ich ein kleines Pythonskript verwenden, dass entweder die Ordnerstruktur als Text-Datei ausgibt (als PDF verschicken?) oder eben die Ordner entsprechend des Musterordners erstellt.
Einen kleinen Tree-Walker mit entsprechender Rekursion.

Wenn es darum geht, dass der Empfänger des verschickten PDFs die Ordnerstruktur nachbauen kann, könnte man gleich ein entsprechendes Skript erzeugen lassen. Aber ein ZIP der Ordnerstruktur zu verschicken, wäre für den Empfänger vermutlich einfacher.

Aber ich bin mir sicher, dass man das auch mit einem Shell-Befehl lösen kann, irgendwas mit "find" auf die Schnelle geschätzt. Eventuell den Ordner 1:1 kopieren und dann mit find alle Dateien löschen und nur Ordner stehen lassen. Das wäre dann ein 1-Zeiler. Es gibt ja ein paar Shell-Cracks hier.

Wenn sich keiner meldet, könnte ich das später mal versuchen (also einer der beiden Wege).

Moin. Verzeiht meine späte Rückmeldung, kranke Kinder!

In der Tat sprichst du mir aus der Seele. Mir geht es einerseits darum, dass ich eine Aufstellung von Dateien brauche, die in spezifischen Ordnern liegt und diese gerne als Textdatei verschicken möchte. Auf der anderen Seite gibt es den Gedanken, dass man eine Ordnerstruktur nachbildet ohne die enthaltenen Daten und diese als zip-Datei verschickt, damit der Gegenüber diese Ordnerstruktur nutzen kann. Wenn deine Zeit und Kenntnisse dies ermöglichen, wäre ich mehr als dankbar!
0
killerspots24.11.2222:27
macuser11
FilelistCreator (DateilistenSchreiber):

Wow, super tool. Da muss ich erstmal durchsteigen, was ich damit alles machen kann...
0
macuser11
macuser1125.11.2201:19
Hoffentlich klappts mit der App

Ja, diese kleinen gratis Softwares wie Datei umbenennen oder Schriften Vorschau sind echt nice

www.sttmedia.de/software
0
ssb
ssb25.11.2209:53
Hier mal ein kleines Script. Das als listfolder.py speichern, und im Terminal mit "python3 listfolders.py" aufrufen - dann wird die Usage ausgegeben. Ins Terminal kannst du per Drag and Drop aus dem Finder dein Source-Verzeichnis ablegen. Das dest Verzeichnis darf noch nicht existieren (Sicherheitsmassnahme):

import os
import sys

def main( src, dest, noInvisibles ):
    print( "Directory scan of '%s'" % src )
    dirlist = list()
    dirlist.sort()
    for root, dirs, files in os.walk(src, topdown=True, onerror=None, followlinks=False):
        for name in dirs:
            if noInvisibles == True and name.startswith('.'):
                # we remove them, so they do not get iterated through
                dirs.remove( name )
                continue
            subpath = os.path.relpath( os.path.join( root, name ), start=src )
            print( ' -  %s' % subpath )
            dirlist.append( subpath )
        # we ignore files

    if dest != None:
        dest = os.path.abspath(dest)
        print( "Replicating to '%s'" % dest)
        if os.path.exists(dest) == False:
            os.makedirs( dest )
        for name in dirlist:
            if os.path.exists( os.path.join( dest, name )) == False:
                os.makedirs( os.path.join( dest, name ))

    print( "Done" )
            

usage = '''
python3 listfolders.py src [dest]
    listing the folder structure of a given path
    src:    path to start the scan of the folder structure
    dest:   (optional) if not passed, just print the structure
            if passed, create all folders of src at dest
            dest gets created itself and it shall not exist
'''

if __name__ == "__main__":
    src = None
    dest = None
    if len( sys.argv ) >= 2:
        src = sys.argv[1]
    if len( sys.argv ) == 3:
        dest = sys.argv[2]
    if src == None:
        print( usage )
        exit( 0 )
    
    if os.path.exists(src) == False:
        print( "Error: the path '%s' does not exist. Aborting." % src )
        exit( 1 )
    if os.path.isdir(src) == False:
        print( "Error: '%s' is a file and not a directory. Aborting." % src )
        exit( 2 )

    if dest != None and os.path.exists( dest ) == True:
        print( "Error: the destination '%s' already exists. Aborting." % dest )
        exit(3)

    main( src, dest, True )

Die eigentliche Arbeit - das Iterieren durch die Verzeichnisstruktur - geschieht in os.walk(...). Die Argumente zu prüfen und zu verifizieren braucht mehr Code als die eigentliche Arbeit
Einen Schönheitswettbewerb gewinnt der Code nicht - bei mir hat er aber funktioniert und war auch erstaunlich schnell. Ich habe es mit einem OpenSource-Projekt ausprobiert:
ssb@EsMac folderlist % python3 listfolders.py /Users/ssb/Projekte/ssb/OpenSource/e2openplugin-OpenWebif out
Directory scan of '/Users/ssb/Projekte/ssb/OpenSource/e2openplugin-OpenWebif'
 -  screenshots
 -  locale
 -  CI
 -  testsuite
 -  plugin
 -  contrib
 -  sourcefiles
 -  testsuite/data
 -  plugin/backport
 -  plugin/public
 -  plugin/controllers
 -  plugin/public/css
 -  plugin/public/images
 -  plugin/public/js
 -  plugin/public/mobile
 -  plugin/public/vxg
 -  plugin/public/static
 -  plugin/public/webtv
 -  plugin/public/modern
 -  plugin/public/fonts
 -  plugin/public/themes
 -  plugin/public/css/images
 -  plugin/public/images/osd
 -  plugin/public/images/remotes
 -  plugin/public/images/mobile
 -  plugin/public/images/boxes
 -  plugin/public/js/sigfinder
 -  plugin/public/mobile/images
 -  plugin/public/static/remotes
 -  plugin/public/modern/css
 -  plugin/public/modern/plugins
 -  plugin/public/modern/js
 -  plugin/public/modern/fonts
 -  plugin/public/modern/css/themes
 -  plugin/public/modern/plugins/node-waves
 -  plugin/public/modern/plugins/bootstrap
 -  plugin/public/modern/plugins/strftime
 -  plugin/public/modern/plugins/choices
 -  plugin/public/modern/plugins/jquery
 -  plugin/public/modern/plugins/momentjs
 -  plugin/public/modern/plugins/jquery-inputmask
 -  plugin/public/modern/plugins/autosize
 -  plugin/public/modern/plugins/animate-css
 -  plugin/public/modern/plugins/chosen
 -  plugin/public/modern/plugins/screenfull
 -  plugin/public/modern/plugins/bootstrap-select
 -  plugin/public/modern/plugins/sweetalert
 -  plugin/public/modern/plugins/xml2json
 -  plugin/public/modern/plugins/bootstrap/css
 -  plugin/public/modern/plugins/bootstrap/js
 -  plugin/public/modern/plugins/bootstrap/fonts
 -  plugin/public/modern/plugins/bootstrap-select/css
 -  plugin/public/modern/plugins/bootstrap-select/js
 -  plugin/public/modern/plugins/bootstrap-select/js/i18n
 -  plugin/public/modern/fonts/materialicons
 -  plugin/public/modern/fonts/roboto
 -  plugin/public/themes/images
 -  plugin/controllers/models
 -  plugin/controllers/views
 -  plugin/controllers/views/responsive
 -  plugin/controllers/views/web
 -  plugin/controllers/views/mobile
 -  plugin/controllers/views/bouqueteditor
 -  plugin/controllers/views/ajax
 -  plugin/controllers/views/responsive/ajax
 -  plugin/controllers/views/bouqueteditor/web
 -  contrib/model_movies
 -  sourcefiles/_utils
 -  sourcefiles/css
 -  sourcefiles/js
 -  sourcefiles/scss
 -  sourcefiles/modern
 -  sourcefiles/jquery-ui
 -  sourcefiles/scss/theme
 -  sourcefiles/modern/css
 -  sourcefiles/modern/plugins
 -  sourcefiles/modern/js
 -  sourcefiles/modern/css/themes
 -  sourcefiles/modern/plugins/node-waves
 -  sourcefiles/modern/plugins/bootstrap
 -  sourcefiles/modern/plugins/vti
 -  sourcefiles/modern/plugins/choices
 -  sourcefiles/modern/plugins/jquery
 -  sourcefiles/modern/plugins/momentjs
 -  sourcefiles/modern/plugins/jquery-inputmask
 -  sourcefiles/modern/plugins/autosize
 -  sourcefiles/modern/plugins/materialize-css
 -  sourcefiles/modern/plugins/animate-css
 -  sourcefiles/modern/plugins/chosen
 -  sourcefiles/modern/plugins/bootstrap-select
 -  sourcefiles/modern/plugins/sweetalert
 -  sourcefiles/modern/plugins/jquery-spinner
 -  sourcefiles/modern/plugins/bootstrap/css
 -  sourcefiles/modern/plugins/bootstrap/js
 -  sourcefiles/modern/plugins/bootstrap/fonts
 -  sourcefiles/modern/plugins/jquery-inputmask/inputmask
 -  sourcefiles/modern/plugins/materialize-css/css
 -  sourcefiles/modern/plugins/materialize-css/js
 -  sourcefiles/modern/plugins/materialize-css/fonts
 -  sourcefiles/modern/plugins/materialize-css/fonts/roboto
 -  sourcefiles/modern/plugins/bootstrap-select/css
 -  sourcefiles/modern/plugins/bootstrap-select/js
 -  sourcefiles/modern/plugins/bootstrap-select/js/i18n
 -  sourcefiles/modern/plugins/jquery-spinner/css
 -  sourcefiles/modern/plugins/jquery-spinner/js
 -  sourcefiles/jquery-ui/unusedimages
 -  doc/source
Replicating to '/Users/ssb/Projekte/test/folderlist/out'
Wenn du im Terminal den Aufruf mit "> list.txt" abschließt, dann erfolgt die Ausgabe in eine Datei.
0
wicki
wicki25.11.2211:05
Liebe Python-Freunde: ja, kann man so machen.

Auf der Kommandozeile geht es aber als Einzeiler:
find . -type d -print > Ergebnis.txt; open Ergebnis.txt
("." = Suche im aktuellen Folder)
„Better necessarily means different.“
+3
frankh25.11.2211:46
wicki
Liebe Python-Freunde: ja, kann man so machen.
Auf der Kommandozeile geht es aber als Einzeiler:
find . -type d -print > Ergebnis.txt; open Ergebnis.txt
("." = Suche im aktuellen Folder)

Und wenn man noch ein mkdir voranstellt hat man schon fast ein script, um die leere Verzeichnisstruktur woanders erstellen zu können:

find . -type d -print | awk '{print "mkdir ZIEL/"$0}' > OrdnerErstellen.sh

ZIEL dabei ersetzen mit einem Ordner, wo die Verzeichnisse erstellt werden können und nach Ausführen von OrdnerErstellen.sh den dann zippen und wegschicken; z.B. ~/Desktop

find . -type d -print | awk '{print "mkdir ~/Desktop/"$0}' > OrdnerErstellen.sh
+2
Wellenbrett25.11.2212:49
frankh
wicki
find . -type d -print | awk '{print "mkdir ZIEL/"$0}' > OrdnerErstellen.sh
Das ist eine sehr elegante Lösung
+2
ssb
ssb25.11.2213:31
Hab ich ja gesagt, dass es im Terminal mit "find" zu einem Einzeiler wird
Der Einzeiler wird aber die "unsichtbaren" Ordner (also die mit Punkt am Anfang des Namens) nicht unterdrücken. Bei meinem Test wäre dann entsprechend das ".git" Verzeichnis mitgekommen. Man weiß ja nicht, was da liegen könnte, weil man es im Finder normalerweise nicht sieht.

Das Python-Skript hat zudem den Vorteil, dass es auch auf anderen Betriebssystemen funktioniert - also auch auf Windows ohne bash-Terminal (allerdings muss dann Python3 installiert sein). Dass ich das Python Skript hier gepostet habe hat aber wenigstens die Terminal-Spezialisten motiviert, ihren Einzeiler ebenfalls zu posten.
0
wicki
wicki25.11.2214:43
ssb
Hab ich ja gesagt, dass es im Terminal mit "find" zu einem Einzeiler wird
Der Einzeiler wird aber die "unsichtbaren" Ordner (also die mit Punkt am Anfang des Namens) nicht unterdrücken. Bei meinem Test wäre dann entsprechend das ".git" Verzeichnis mitgekommen. Man weiß ja nicht, was da liegen könnte, weil man es im Finder normalerweise nicht sieht.

Auch dafür gibt es im find-Kommando eine Lösung:
find . -type d -not -path '*/.*' -print > Ergebnis2.txt; open Ergebnis2.txt
blendet alle (Unix-)Ordner aus, die mit einem Punkt beginnen (und daher im Finder unsichtbar sind).
„Better necessarily means different.“
+2
frankh25.11.2220:46
"Excellent, Smithers"
Falls das Unterdrücken die Anforderung war - "komplexe Ordnerstruktur mit allen Unterordnern" -
0
killerspots29.11.2212:28
Wellenbrett
frankh
wicki
find . -type d -print | awk '{print "mkdir ~/Desktop/"$0}' > OrdnerErstellen.sh

Wow, ihr seid ja geil. Aber wie handhabe ich das nun genau? Ich gebe diesen Code ein im Terminal, ersetzte den "." durch meinen Pfad zum Ordner, der abgebildet werden soll, schreibe statt ZIEL zB ~/Desktop/ und klicke Enter. Aber dann passiert nichts weiter.
+1
ssb
ssb29.11.2213:30
Du solltest in dem konkreten Fall eine Datei "OrdnerErstellen.sh" dort erhalten, wo du dich gerade im Terminal befindest. Üblicherweise dein Home-Verzeichnis also "/User/xyz" oder "~".
Nachdem du die Datei mit "chmod 755 OrdnerErstellen.sh" ausführbar gemacht hast, kann du diese mit "./OrdnerErstellen.sh" ausführen und in deinem Desktop-Verzeichnis wird die Ordnerstruktur erstellt.
+1

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.