tree(1) für arbiträre Daten

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

tree(1) für arbiträre Daten

Beitrag von paedubucher » 07.08.2021 16:16:29

Ich habe vorhin wieder einmal bemerkt, wie schön übersichtlich doch die Ausgabe von tree(1) ist:

Code: Alles auswählen

$ tree
.
├── archetypes
│   └── default.md
├── config.toml
├── content
├── data
├── layouts
│   └── index.html
├── static
└── themes
Sowas könnte ich gelegentlich auch in Dokumenten gebrauchen, jedoch nicht für Dateien, sondern für beliebige Hierarchien. Ich würde gerne sowas eingeben:

Code: Alles auswählen

- C
    - C++
- Smalltalk
- Erlang
    - Elixir
- Basic
- Fortran
Und dann sowas erhalten:

Code: Alles auswählen

├── C
│   └── C++
├── Smalltalk
├── Erlang
│   └── Elixir
├── Basic
└── Fortran
Ein lustiger Unix-Hack wäre es natürlich, die obige Datenstruktur tatsächlich im Dateisystem unter /tmp zu erstellen, und dann effektiv tree(1) darauf zu verwenden. Andererseits sollten die Strings auch Sonderzeichen enthalten können, ohne mühsames hin- und herescapen.

Hat jemand eine Idee? Ich habe gerade nicht den Kopf, das Ding selber auszuprogrammieren.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: tree(1) für arbiträre Daten

Beitrag von JTH » 07.08.2021 17:08:39

paedubucher hat geschrieben: ↑ zum Beitrag ↑
07.08.2021 16:16:29
Ein lustiger Unix-Hack wäre es natürlich, die obige Datenstruktur tatsächlich im Dateisystem unter /tmp zu erstellen, und dann effektiv tree(1) darauf zu verwenden.
Das ist schnell ausprobiert, passt ja auch zum alles-ist-eine-Datei-Motto :)

Code: Alles auswählen

$ cat treeprint 
#!/bin/sh
set -eu

cleanup()
{
	rm -fr "$tmpdir"
}

if [ $# -lt 1 ]; then
	echo "missing arguments" >&2
	exit 2
fi

tmpdir=$(mktemp -d)
trap cleanup EXIT INT TERM
cd "$tmpdir"

title=${1:-.}
shift
mkdir -p "$title"
for str in "$@"; do
	mkdir -p "$title/$str"
done

tree -a --noreport "$title"

Code: Alles auswählen

$ ./treeprint "Programming Languages" C C/C++ Smalltalk Erlang Erlang/Elixir Basic Fortran 
Programming Languages
├── Basic
├── C
│   └── C++
├── Erlang
│   └── Elixir
├── Fortran
└── Smalltalk
Um Sonderzeichen kann man sich kümmern, wenn ein Problem auftaucht ;) Ein einzelner Eintrag kann so natürlich keinen Schrägstrich enthalten, nur als Unterteilung in der Hierarchie.
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: tree(1) für arbiträre Daten

Beitrag von eggy » 07.08.2021 17:14:38

oder gleich in awk

Code: Alles auswählen

awk '{ s=index($0, "-"); l = substr($0, s +2 ); s2=s; printf "|"; while (s>0) {printf " "; s--;} ; if (s2 > 2){ printf "└" }; t=4;   while(t>0){printf "-";t--;}; print l}' datei.txt
... weder hübsch noch perfekt, nur mal als proof-of-concept

Code: Alles auswählen

| ----C
|     └----C++
| ----Smalltalk
| ----Erlang
|     └----Elixir
| ----Basic
| ----Fortran
wenn man mehr Zeit reinstecken will: vorne noch nen hübsches Zeichen einfügen und auch lieber mitzählen, in welcher Verschachtelungstiefe man ist, bzw die Leerstellen von Regechsen fressenlassen ... Meillo findet da sicher ne hübschere Variante :mrgreen:

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: tree(1) für arbiträre Daten

Beitrag von paedubucher » 07.08.2021 21:05:26

Wow, funktioniert beides!

@JTH: Die Idee mit dem Slash für die Hierarchie ist natürlich super. Wenn man da in der richtigen Datenstruktur denkt, hat man das Problem ja schon fast gelöst!

@eggy: Mit ein paar gut gewählten Zeichen für die Linien funktioniert das auch prima!
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: tree(1) für arbiträre Daten

Beitrag von JTH » 07.08.2021 22:21:41

eggy hat geschrieben: ↑ zum Beitrag ↑
07.08.2021 17:14:38
oder gleich in awk
Wird ja auch mal wieder Zeit :lol: :wink:
Manchmal bekannt als Just (another) Terminal Hacker.

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: tree(1) für arbiträre Daten

Beitrag von reox » 08.08.2021 14:49:38

tree kann auch sowas:

Code: Alles auswählen

INPUT OPTIONS
       --fromfile  Reads  a directory listing from a file rather than the file-system.  Paths provided on the command line are files to read from rather than directories to search.  The dot (.) directory
       indicates that tree should read paths from standard input.

Code: Alles auswählen

$ cat test.txt
C
C/C++
Smalltalk
Erlang
Erlang/Elixir
Basic
Fortran
$ tree --fromfile test.txt
test.txt
├── Basic
├── C
│   └── C++
├── Erlang
│   └── Elixir
├── Fortran
└── Smalltalk

2 directories, 5 files
oder so:

Code: Alles auswählen

$ echo "C C/C++ Smalltalk Erlang Erlang/Elixir Basic Fortran" | tr ' ' '\n' | tree --fromfile .
.
├── Basic
├── C
│   └── C++
├── Erlang
│   └── Elixir
├── Fortran
└── Smalltalk

2 directories, 5 files
kA ob man sich da noch mit dem IFS spielen kann :)

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: tree(1) für arbiträre Daten

Beitrag von Meillo » 08.08.2021 16:27:17

JTH hat geschrieben: ↑ zum Beitrag ↑
07.08.2021 17:08:39
Das ist schnell ausprobiert [...]
eggy hat geschrieben: ↑ zum Beitrag ↑
07.08.2021 17:14:38
oder gleich in awk
Ich bin stolz auf auch! :THX:

... dann lehne ich mich mal weiter zurueck. ;-)
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: tree(1) für arbiträre Daten

Beitrag von eggy » 08.08.2021 16:28:27

reox hat geschrieben: ↑ zum Beitrag ↑
08.08.2021 14:49:38
tree kann auch sowas:
@reox: So geht das aber gar nicht. Wo kommen wir denn da hin, mein lieber, einfach nen Programm für etwas benutzen, für dass es gedacht ist?! Was fällt Dir denn ein?!? :mrgreen: :THX:

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: tree(1) für arbiträre Daten

Beitrag von Meillo » 08.08.2021 16:32:17

@reox: Klasse! :THX: ... damit hast du nun JTH und eggy in die Tasche gesteckt. :-P
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: tree(1) für arbiträre Daten

Beitrag von paedubucher » 08.08.2021 18:40:42

Wow, --fromfile habe ich leider verpasst. Ausgerechnet die letzte Option, die in der Manpage auftaucht, da war meine Aufmerksamkeitsspanne wieder mal zu kurz :wink:
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: tree(1) für arbiträre Daten

Beitrag von JTH » 08.08.2021 18:47:50

Ich bin ja ein bisschen überrascht über diesen neumodischen Featurebloat mit --fromfile. Wie war das mit dieser Philosophie von wegen ein Werkzeug, eine Aufgabe und die gut gelöst? Da muss man ja gar nichts mehr kombinieren und selbst lösen :mrgreen:

Meine Lösung kann immerhin ohne extra Aufwand den . an der Wurzel mit Sinnvollerem ersetzen!
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: tree(1) für arbiträre Daten

Beitrag von Meillo » 08.08.2021 19:13:57

Die Option scheint recht neu zu sein. Version 1.6 hat sie noch nicht, in 1.8 ist sie da.

Ich finde schon, dass sie immer noch der One-Tool-one-Task-Idee entspricht, denn tree(1) erzeugt eine grafische Darstellung von Verzeichnisbaeumen. Das passiert auch wenn die Verzeichnisbaeume von woanders herkommen.

Aber ich habe dennoch meine Kritik an der Umsetzung des Usecases. Hier der Abschnitt in der Manpage:
Manpage tree(1) hat geschrieben: INPUT OPTIONS
--fromfile Reads a directory listing from a file rather than the file-
system. Paths provided on the command line are files to read from
rather than directories to search. The dot (.) directory indicates
that tree should read paths from standard input.
Erstens: Warum wird hier `.' verwendet wenn von stdin gelesen werden soll und nicht `-', wie es Konvention ist?

Zweitens: Warum braucht es hierfuer eine eigene Option und man nutzt nicht die Kommandozeilenargumente dazu? Tree kann bereits mehrere Pfadangaben auf der Kommandozeile bekommen. Warum uebergibt man nicht einfach jede Zeile der Inputdatei als Kommandozeilenargument? Dazu kann man tree dann auch so aufrufen:

Code: Alles auswählen

tree `cat infile`
Tree duerfte dann nur nicht mit einem Fehler aussteigen, wenn es den Pfad nicht gibt. (Dafuer koennte man eine Option einfuehren.) Mit so einem Ansatz haette an der Arbeitsweise von tree gar nichts geaendert werden muessen.

Drittens: Wenn man schon ein Uebergeben der Pfade aus einer Datei einbaut, warum verhaelt sich das dann nicht identisch zum Uebergeben der Pfade als Kommandozeilenargument? (Im einen Fall fuehren nicht-existente Pfade zu Fehlern im anderen Fall nicht.)

An diesen Stellen faengt die Featuritis an, deren schlimmste Folge ist, dass die konzeptionelle Klarheit verloren geht. Es sieht auf den ersten Blick halt immer so einfach aus, so eine Funktion einzubauen; erst ueber die Zeit zeigen sich die negativen Folgen.
Use ed once in a while!

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: tree(1) für arbiträre Daten

Beitrag von reox » 08.08.2021 20:34:14

Ich hab das auch erst jetzt in der manpage gesehen und war ehrlich gesagt auch etwas verwundert über die Funktionsweise...

Es ist seit 1.8.0 drin und der changelog sagt:

Code: Alles auswählen

 Added an experimental --fromfile option (suggested by several people.) This may eventually be replaced or supplimented by a --fromjson option. 
Vermutlich ist es deshalb so komisch...
Ich glaube das mit dem . erklärt sich so: Es wird als verzeichnis dann der dateiname angegeben. Vermutlich wollen sie das Verhalten eines aufrufs von tree simulieren, wenn man keine argumente angibt und wollen aber nicht - in ein . umschreiben...

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: tree(1) für arbiträre Daten

Beitrag von Meillo » 08.08.2021 21:15:44

Zeit um eine bessere Umsetzung einzureichen ...? ;-)
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: tree(1) für arbiträre Daten

Beitrag von eggy » 08.08.2021 23:02:00

@Meillo: s/komischercode/exec(awk) ?

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: tree(1) für arbiträre Daten

Beitrag von reox » 09.08.2021 09:11:35

Meillo hat geschrieben: ↑ zum Beitrag ↑
08.08.2021 21:15:44
Zeit um eine bessere Umsetzung einzureichen ...? ;-)
der hat ja nicht mal git - da muss man ja ne mail schreiben :o
oder gibts irgendwo den source von tree in versionskontrolle? Auf der offiziellen Seite hätte ich nur tarballs gesehen

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: tree(1) für arbiträre Daten

Beitrag von Meillo » 09.08.2021 09:19:33

reox hat geschrieben: ↑ zum Beitrag ↑
09.08.2021 09:11:35
Meillo hat geschrieben: ↑ zum Beitrag ↑
08.08.2021 21:15:44
Zeit um eine bessere Umsetzung einzureichen ...? ;-)
der hat ja nicht mal git - da muss man ja ne mail schreiben :o
Ist mir persoenlich deutlich lieber als die Projekte, die nur Github haben und mit denen man ohne einen Github-Account ueberhaupt keinen Kontakt aufnehmen kann.

Ausserdem ist er als Entwickler nett. Hab da schon mal einen Bugfix eingereicht.
oder gibts irgendwo den source von tree in versionskontrolle? Auf der offiziellen Seite hätte ich nur tarballs gesehen
Debian hat ein Repo fuer die Paketerstellung: https://salsa.debian.org/debian/tree-packaging
(Das findet man ueber die Paketseite, klick auf Developer Information, dann kommt man auf den Debian Package Tracker und dort ist das Repo dann links unter VCS verlinkt.)
Use ed once in a while!

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: tree(1) für arbiträre Daten

Beitrag von reox » 09.08.2021 10:02:15

Meillo hat geschrieben: ↑ zum Beitrag ↑
09.08.2021 09:19:33
Ist mir persoenlich deutlich lieber als die Projekte, die nur Github haben und mit denen man ohne einen Github-Account ueberhaupt keinen Kontakt aufnehmen kann.
Ja, nur in diesem Fall wäre es halt schön sich nur die Änderungen betreffend --fromfile ansehen zu können. Allerdings scheint die ganze Magie eh nur in file.c zu liegen: https://salsa.debian.org/debian/tree-pa ... bfcbbce382

Antworten