Disktree

Bash, Shell, PHP, Python, Perl, CGI
alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Disktree

Post by alexander newald » 2005-10-25 19:45

Da immer wieder gefragt wurde, wie man am Besten den Inhalt eines Verzeichnisses und der Unterverzeichnisse darstellen kann, habe ich ein ganz kleines Skript gebastelt, welches dies erledigt:

Code: Select all

alexander @ ~ > disktree /home/apache/
 * finding dirs ...
 * getting usage...
     5.66 MB  95.71        /htdocs        *******************************
   396.00 KB   6.54          /images      **
     4.00 KB   0.07            /retired
    12.00 KB   0.20          /status
     3.71 MB  62.68          /mrtg        ********************
   244.00 KB   4.03        /cgi-bin       *
     8.00 KB   0.13        /.ssh
Zum Downloaden und Testen auf linux.newald.de

Ist kein wirklich schöner Programmierstiel und ohne Kommentar, aber wenn gefällt hole ich das nach.

braindead
RSAC
Posts: 257
Joined: 2002-10-22 09:49
Location: vorm Rechner

Re: Disktree

Post by braindead » 2005-10-25 21:30

++

mehr kann ich dazu einfach net sagen *G*

hornox
Posts: 139
Joined: 2005-09-22 23:09

Re: Disktree

Post by hornox » 2005-10-25 21:55

Schau dir mal an was dein Skript macht wenn ein Verzeichnis z.b. "foo;bar" heißt.

Ist zwar IMHO keine Sicherheitslücke weil man so meines Wissens weder Pfadangaben noch Parameter einschmugeln kann aber zumindest ein Bug.

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Disktree

Post by alexander newald » 2005-10-25 22:41

Update verfügbar

hornox
Posts: 139
Joined: 2005-09-22 23:09

Re: Disktree

Post by hornox » 2005-10-25 23:29

Code: Select all

hornox@devmode:~/test$ mkdir "foo
> bar"
hornox@devmode:~/test$ mkdir '"'
hornox@devmode:~/test$ /usr/bin/perl disktree_01.txt .
 * finding dirs ...
 * getting usage...
 FAILED ./foo
 FAILED bar
sh: -c: line 1: unexpected EOF while looking for matching `"'
sh: -c: line 2: syntax error: unexpected end of file
     0.00 B    0.00    /"    
Gibt vermutlich noch mehr...

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: Disktree

Post by Roger Wilco » 2005-10-25 23:30

Ich sehe jetzt nicht so ganz den Vorteil gegenüber "du -hs /path/to/dir/*" oder "find /path/to/dir -type d -exec du -hs {} ;". Das mag aber durchaus an mir liegen... :roll:

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Disktree

Post by alexander newald » 2005-10-26 01:48

@HornOx

Wie quote ich in der Shell alle Sonderzeichen raus?

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Disktree

Post by alexander newald » 2005-10-26 01:55

@Roger Wilco

Für mich, dass man Verzeichnisse, die deutlich mehr als andere "Verbrauchen" am Balken erkennt.

Bei einer grossen Anzahl von Verzeichnissen ist der visuelle Effekt ein Vorteil. (zumindest für mich).

So finde ich z.B. in /usr recht leicht /qt als Verzeichniss mit viel Daten, bei "find /usr -type d -exec du -hs {} ;" fällt mir das in der langen Liste (bei mir 4430 Zeilen) schon viel schwerer:

Code: Select all

alexander @ ~ > disktree /usr/|grep "***"
   350.15 MB  32.32      /local                                              **********
   154.97 MB  14.30        /qt                                               ****
   270.98 MB  25.01      /lib                                                ********

hornox
Posts: 139
Joined: 2005-09-22 23:09

Re: Disktree

Post by hornox » 2005-10-27 13:07

Wie quote ich in der Shell alle Sonderzeichen raus?
Soweit ich weiß geht das gar nicht.
Aber in Perl kannst du dir einen entsprechenden regulären Ausdruck basteln der alle Zeichen maskiert, z.b. $dir =~ s/([^60-71101-132141-172])/"\".oct($1)/eg

braindead
RSAC
Posts: 257
Joined: 2002-10-22 09:49
Location: vorm Rechner

Re: Disktree

Post by braindead » 2005-10-28 09:52

HornOx wrote:
Wie quote ich in der Shell alle Sonderzeichen raus?
Soweit ich weiß geht das gar nicht.
Aber in Perl kannst du dir einen entsprechenden regulären Ausdruck basteln der alle Zeichen maskiert, z.b. $dir =~ s/([^\060-\071101-132141-172])/"".oct($1)/eg
du kannst die regex jetzt auch einfach mit sed laufen lassen und schon hast du das ganze auch in der Shell.