[linux-l] Announcement: pftdbns 0.2.5

Oliver Bandel oliver at first.in-berlin.de
So Mai 29 01:20:38 CEST 2005


Hallo,

ich announce hier einfach mal ein nettes Toolchen von mir,
weil ich denke, es hat ne Menge praktischen Nutzen.
Ausserdem hat das auf der linux-announce-list anscheinend
nicht geklappt ( oder ist der Moderator vor'm Bildschirm
eingeschlafen? ;-) ).


Das Tool heisst "pftdbns" und steht als Abkürzung für
"put files to directories (sorted) by name structure".

Das Tool ist also dazu da, Dateien aufgrund einer vom Dateinamen
abgeleiteten Eigenschaft in Verzeichnisse zu schieben, die
entsprechend dieser Eigenschaft auch benannt sind.

Die Eigenschaft, von der ich spreche, ist die Dateinamen-Struktur
der Datei. Gemeint ist: Die Dateinamen werden basierend auf
"Character Classes", also Zeichenklassen/Zeichengruppierungen
zusammen gefasst und in ein Verzeichnis geschoben, dessen Name
diese Zeichenkettenklasse repräsentiert.

So, nachdem ich solch abstrakten Krams geredet habe, nun mal
Klartext, am besten anhand eines Beispiels:




Man habe folgende Dateinamen im aktuellen Arbeitsverzeichnis:

=====
README
compile
pftdbns
nobody.tex
01-hello.doc
01-hello.tex
01-hello.txt
03-hello.tex
12-hello.tex
restauration
everybody.tex
00_1311djs.txt
00_1338djs.txt
00_1738djs.txt
02_1311djs.txt
02_9911djs.txt
02_2_example.jpg
02_7_example.jpg
02_9_example.jpg
42_7_example.jpg
pftdbns.new_sort
pftdbns.old_sort
putfilestodirs.ml
putfilestodirs.cmi
putfilestodirs.cmo
putfilestodirs.ml.html
putfilestodirs.ml.old_sort
=====

"ls" gäbe folgendes aus:

 (weil in obiger Reihenfolge erzeugt, noch haldwegs durchsichtig,
 ansonsten wäre es wirklich chaotisch)

=====
first:/tmp/_PFTDBNS_ oliver$ ls
00_1311djs.txt                  02_9911djs.txt                  pftdbns
00_1338djs.txt                  02_9_example.jpg                pftdbns.new_sort
00_1738djs.txt                  03-hello.tex                    pftdbns.old_sort
01-hello.doc                    12-hello.tex                    putfilestodirs.cmi
01-hello.tex                    42_7_example.jpg                putfilestodirs.cmo
01-hello.txt                    README                          putfilestodirs.ml
02_1311djs.txt                  compile                         putfilestodirs.ml.html
02_2_example.jpg                everybody.tex                   putfilestodirs.ml.old_sort
02_7_example.jpg                nobody.tex                      restauration
first:/tmp/_PFTDBNS_ oliver$ 
=====

Wie findet man sich in diesem Chaos zurecht und wie kann man die Dateien
in jeweils einzelne Verzeichnisse verfrachten, die alle _*der Namensgebung
nach*_ zusammen passen?!


So sieht doch beispielswiese  "01-hello.txt" so aus, als ob es aus
"01-hello.doc" durch Konvertierung mithilfe eines Tools erzeugt wurde.
Ebenso könnte es auch bei "01-hello.tex" sein, daß es zu den anderen
beiden dazu gehört.

Die Dateien "00_1311djs.txt", "00_1338djs.txt" und "00_1738djs.txt" scheinen
zusammen zu gehören, und zwar zu einer Reihe von Textdateien, die alle
aus "der selben >>Feder<<" stammen. Das legt die Namensgebung zumindest nahe.

Auch bei anderen der Dateien sind manche Eigenschaften so, daß sie
auf Zusammengehörigkeit schliessen lassen.

Man könnte sich nun mit den Dateinamen selbst nicht so ohne weiteres
weiter bringen. Allerdings bieten sich Regular Expressions an.
In der Tat. Allerdings ist das herum-Gefrickel mit immer wieder
neuen Regexps, um die passenden Files zusammen zu suchen, doch recht
lästig. Das Erstellen der Regexps nämlich muß man noch selbst
übernehmen. Und das ist meistens ja das zeitaufwendigste Problem.

Für die oben genannten zwei verschiedenen Gruppen von Dateinamen
hätte man also schon zwei Regular Expressions erstellen müssen.
Bei entsprechend großem Gewusel im Verzeichnis würde man auch
mit Regexps ewig brauchen, und der Nutzen der Shell nähert sich
dem einer GUI an. ;-)

Nun haben wir aber einen Computer. Und den kann man netter weise programmieren.
Soll dieses Maschinchen also die Aufgabe übernehmen und die Klassifizierung
selbst durchführen.

Und die Sache ist ganz einfach:
Man bildet einfach die in der Sprache der
 Regular-Expressions/im Regexp-Slang
so genannten "Character Classes" (CharClass(es)) und fasst dann
alle Files, die die selbe CharClass haben zusammen und verschiebt sie gleich noch
in Verzeichnisse, die auch nach diesen Charclasses benannt werden.
Dann hat man sich die neue Ordnung nicht nur erfunden, sondern sie auch noch
durch Aufräumen realisiert! :)

Und schon hat man ein sauberes Arbeitsverzeichnis! :)

(Die BSR würde vor Neid erblassen!)


Und wie dat jeht?

Im Prinzip werden bloß alle Char's aus dem Dateinamen umgemappt,
so daß alle 'a'..'z' und alle 'A' .. 'Z' ein 'l' (für "letter")
werden. Alle '0'..'9' werden 'i' für "integer" usw.

Das ergäbe folgendes Bild:

=========
first:/tmp/_PFTDBNS_ oliver$ pftdbns -ls *
README => llllll
compile => lllllll
pftdbns => lllllll
nobody.tex => lllllldlll
01-hello.doc => iiollllldlll
01-hello.tex => iiollllldlll
01-hello.txt => iiollllldlll
03-hello.tex => iiollllldlll
12-hello.tex => iiollllldlll
restauration => llllllllllll
everybody.tex => llllllllldlll
00_1311djs.txt => iioiiiillldlll
00_1338djs.txt => iioiiiillldlll
00_1738djs.txt => iioiiiillldlll
02_1311djs.txt => iioiiiillldlll
02_9911djs.txt => iioiiiillldlll
02_2_example.jpg => iioiollllllldlll
02_7_example.jpg => iioiollllllldlll
02_9_example.jpg => iioiollllllldlll
42_7_example.jpg => iioiollllllldlll
pftdbns.new_sort => llllllldlllollll
pftdbns.old_sort => llllllldlllollll
putfilestodirs.ml => lllllllllllllldll
putfilestodirs.cmi => lllllllllllllldlll
putfilestodirs.cmo => lllllllllllllldlll
putfilestodirs.ml.html => lllllllllllllldlldllll
putfilestodirs.ml.old_sort => lllllllllllllldlldlllollll
first:/tmp/_PFTDBNS_ oliver$ 
=========


Und nach ausführen von "pftdbns" ohne die "-ls"-Option:

=========
first:/tmp/_PFTDBNS_ oliver$ pftdbns  *
first:/tmp/_PFTDBNS_ oliver$ ls
iioiiiillldlll                  lllllll                         lllllllllllllldlldllll
iioiollllllldlll                llllllldlllollll                lllllllllllllldlldlllollll
iiollllldlll                    llllllllldlll                   lllllllllllllldlll
llllll                          llllllllllll
lllllldlll                      lllllllllllllldll
first:/tmp/_PFTDBNS_ oliver$ 
=========

Und ein entsprechendes "ls -R" ergäbe mehr, als was ich Euch jetzt noch zumuten will.




Es gibt noch einige weitere Optionen von pftdbns, und zwar folgende:


Use the program with following options:
  -dp directory name-prefix
  -fd fixed directory name
  -l  function selection: only list filenames; do not move files
  -ls function selection: only list filenames and name-structure; do not move files
  -ld function selection: only list filenames and directory name; do not move files
  -la function selection: only list (list all); do not move files
  -tf template filter
  -v  version of the program
  -help  Display this list of options
  --help  Display this list of options


Die Details dann im README oder der Manpage (auch als pdf vorhanden) nachlesen.


Das Tool könnt ihr hier finden:

    ftp://www.belug.org/new/user/ob/Programs/Tools/pftdbns/


Die aktuelle Version ist die 0.2.5 und das gute Stück ist unter der GPL
weiter verteilbar.

Auf Feedback bzgl. Nutzens und Anwenderfreude freue ich mich.
Auch auf Anregungen bzgl. weiterer Optionen (ein paar sind schon geplant).


Gruß,
   Oliver


P.S.: Ach so, also Ihr müßt OCaml installiert haben, damit ihr das
      compilieren könnt (mit "sh compile" ist das dann janz fix jemacht).



-- 
 "This sentence consists of thirty-nine letters."
                               (Heinz von Foerster)



Mehr Informationen über die Mailingliste linux-l