Inhalt + Dateiname speichern

Post Reply
Message
Author
Max+Moritz+Sievers

Inhalt + Dateiname speichern

#1 Post by Max+Moritz+Sievers »

Ich will meine KDE-Links in eine HTML Datei speichern. Ein KDE-Link ist etwa so aufgebaut:
[Desktop Entry]
Icon=www
Type=Link
URL=http://degraaff.org/checkbot/

Ich will nun das was nach "URL=" kommt und den Dateinamen in eine HTML-Datei speichern.

Den Inhalt aller Dateien einer Verzeichnisses bekomme ich mit "less *.desktop > bookmarks.txt" aber wie kann ich die Dateinamen den Inhalten in bookmarks.txt automatisch zuordnen? Es gibt ja schließlich auch Unterverzeichnisse in den Verzeichnissen. Sollte ich vielleicht gar nicht less sondern irgendeine libc-Funktion nutzen?

PS.: Ich habe erst sehr wenig Programmiererfahrung.

User avatar
Eddie
Posts: 180
Joined: 22. Sep 1999 9:28
Location: Lennestadt

Re: Inhalt + Dateiname speichern

#2 Post by Eddie »

Folgendes Script durchsucht rekursiv ab dem aktuellen Verzeichnis alle Dateien mit der Endung ".desktop", sucht den String "URL=" aus dieser Datei und schreibt Dateinamen und die URL in die Datei "bookmarks.txt".

Meinst du sowas?

---[CUT]---
#!/bin/sh
rm -f bookmarks.txt
for i in `find . -name "*.desktop"`; do
for j in `grep "URL=" $i`; do
echo "$i - `echo $j | cut -f2 -d=`" >> bookmarks.txt
done
done
---[CUT]---
Last edited by Eddie on 23. Nov 2000 0:38, edited 1 time in total.
Gruß
Eddie

Jochen

Re: Inhalt + Dateiname speichern

#3 Post by Jochen »

Vorneweg: Die Lösung von Eddie tut's problemfrei! Aaaber...

Es gibt ja nix, was man nicht noch verbessern könnte! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

<pre>find . -name "*.desktop" | xargs sed -n 's/^URL=\(.*\)/\1/p' > bookmarks.txt</pre>
reicht schon, wenn man nur die URLs haben will. Braucht man die Dateinamen dazu tatsächlich auch noch, nimmt man awk statt sed:<pre>find . -name "*.desktop" | xargs awk '/^URL=/ {sub(/^URL=/,""); print FILENAME,"-",$0}' > bookmarks.txt</pre>Und warum diese Klugscheisserei? Ich habe die Erfahrung gemacht, dass Shellskripte immer dann langsam werden, wenn viele Prozesse erzeugt und wieder runtergerissen werden. Bei Eddies Lösung werden pro *.desktop-Datei immer zwei Prozesse erzeugt (grep und cut), bei meinen Lösungen insgesamt 3 Prozesse, egal wieviele Dateien.

Aber einen Vorteil hat Eddies Lösung: Sie ist besser zu lesen un zu verstehen.

User avatar
Eddie
Posts: 180
Joined: 22. Sep 1999 9:28
Location: Lennestadt

Re: Inhalt + Dateiname speichern

#4 Post by Eddie »

Hi!

Ich hab's zwar nicht ausprobiert, aber Jochen hat in allen Punkten recht... <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

*seufz* Ich sollte mich vielleicht doch mal mit dem awk anfreunden... <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Gruß
Eddie

User avatar
Eddie
Posts: 180
Joined: 22. Sep 1999 9:28
Location: Lennestadt

Re: Inhalt + Dateiname speichern

#5 Post by Eddie »

Jetzt habe ich's doch mal getestet. Hier das Ergebnis:

Meine Lösung:
0.16user 0.13system 0:00.29elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (3475major+2844minor)pagefaults 0swaps

Jochen's Lösung:
0.02user 0.00system 0:00.01elapsed 125%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (96major+27minor)pagefaults 0swaps

Max Moritz Sievers

Re: Inhalt + Dateiname speichern

#6 Post by Max Moritz Sievers »

Hi Christian Drüeke,
leider findet dein Script nicht alle *.desktop Dateien auf meinem Rechner.
Ich habe eine Menge Bookmarks aber dein Script schreibt in bookmarks.txt nur 10 Stück.
Das Format ist schon ziemlich gut. Ich denke ich kann daraus irgendwie HTML-Links erzeugen.


Hi Jochen,
ich kenne mich zwar weder mit sed noch mit awk aus, aber ich glaube ich habe die Befehle richtig abgeschrieben. Da in den Dateinamen meiner Bookmarks oft Leerzeichen sind, kommen sed und awk da anscheinend durcheinander. Jeder (durch Leerzeichen getrennte) Teil des Dateinamens der ersten Datei wird als eigener Dateiname interpretiert. Deshalb kann der Befehl keine einzige Datei finden, wenn der Name der ersten Datei Leerzeichen enthält. Ist das eine Macke von sed und awk oder kann man Namen mit Leerzeichen irgendwie benutzbar machen?

Auf jeden Fall vielen Dank für Eure Hilfe. Ich muss mal mehr man-pages lesen.

User avatar
Eddie
Posts: 180
Joined: 22. Sep 1999 9:28
Location: Lennestadt

Re: Inhalt + Dateiname speichern

#7 Post by Eddie »

Hi!

Dann kannst du es so machen...

---[CUT]---
#!/bin/sh
cat << EOFHEADER > bookmarks.html
<HTML>
<HEAD>
<TITLE>Meine Bookmarks</TITLE>
<BODY>
<CENTER>
<H1>Meine Bookmarks!</H1>
EOFHEADER
find . -name "*.desktop" > /tmp/tmp.create_bookmarks.$$
while read file; do
echo $file
for i in `grep "URL=" "$file"`; do
URL=`echo $i | cut -f2 -d=`
echo "<BR>$file - <A HREF=\"$URL\">$URL</A>" >> bookmarks.html
done
done < /tmp/tmp.create_bookmarks.$$
cat << EOFFOOTER >> bookmarks.html
</BODY>
</HTML>
EOFFOOTER
rm -f /tmp/tmp.create_bookmarks.$$
---[CUT]---

Geht mit Sicherheit auch wieder einfacher ( ;-: ), funktioniert aber...
Gruß
Eddie

User avatar
Eddie
Posts: 180
Joined: 22. Sep 1999 9:28
Location: Lennestadt

Re: Inhalt + Dateiname speichern

#8 Post by Eddie »

Bevor ich's vergesse, wenn du nicht durchblicken solltest, schick mit kurz 'ne Mail, dann schicke dir das Script mit ein paar Kommentaren zu...

Jochen

Re: Inhalt + Dateiname speichern

#9 Post by Jochen »

Na denn...

Du hast natürlich recht, Max, Leerzeichen in Namen machen Probleme. Der Übeltäter ist an der Stelle weder awk noch sed, sondern xargs. Das Programm baut aus dem Output von find eine Kommandozeile für sed bzw. awk zusammen. Dabei betrachtet er Whitespace (Blanks, Tabs, Newlines) als Trenner. Das ist auch das Problem von Eddie, sein `find...` für die for-Schleife wird noch mal von der Shell beackert, und die macht das gleiche. Die Dateien, die dort funktionieren, haben alle keine Blanks im Namen, richtig?

Aber es wäre ja nicht Linux, wenn es nicht eine einfache Lösung gäbe <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">:<pre>find . -name "*.desktop" -print0 | xargs -0 awk '/^URL=/ {sub(/^URL=/,""); print "<BR><A HREF=\""$0"\">"$0"</A>"}' >> bookmarks.html</pre>Jetzt schliesst find alle gefundenen Dateinamen mit einem Null-Byte ab, und xargs verwendet nur dieses Null-Byte, um die Trennstellen zwischen den Argumenten zu finden.

Vor die o.a. Zeile packst Du den ersten Teil aus Eddies vorherigen Listing (cat <<EOFHEADER >bookmark.html ..... EOFHEADER) und hinten dran den Teile von "cat << EOFFOOTER >> bookmarks.html" bis "EOFFOOTER", jeweils inklusive. Dann erhältst Du direkt ein Konqueror-taugliches HTML-File.

@Eddie: Du brauchst übrigens auch keine temporäre Datei; versuchs mal mit <pre>find . -name "*.desktop" | while read file ; do .... ; done</pre>Tut's einwandfrei, und im Falle des Falles liegen keine Dateileichen umher...

Max Moritz Sievers

Re: Inhalt + Dateiname speichern

#10 Post by Max Moritz Sievers »

Jetzt funktioniert es schon ziemlich gut. Vielen Dank, dass Ihr mir so ausführlich geholfen habt.
Ich benutze jetzt folgendes Script:

#!/bin/sh
cat << EOFHEADER > bookmarks.html
<HTML>
<HEAD>
<TITLE>Max Moritz Sievers's Bookmarks</TITLE>
<BODY>
<CENTER>
<H1>Max Moritz Sievers's Bookmarks!</H1>
EOFHEADER
find . -name "*.desktop" -print0 | xargs -0 awk '/^URL=/ {sub(/^URL=/,""); print "<BR><A HREF=\""$0"\">"FILENAME"</A>"}' >> bookmarks.html
cat << EOFFOOTER >> bookmarks.html
</BODY>
</HTML>
EOFFOOTER

Trotzdem werden die Dateinamen nicht übernommen. Auch wenn ich die Anführungszeichen wegnehme funktioniert es nicht.

Dann ist da noch eine Funktion, die ich gerne hätte. Die Konqueror-Bookmarks sind wie gesagt einzelne Dateien, die in mehreren Unterordnern sein können. Eure Befehle sind alle recursiv und unterscheiden nicht zwischen den Unterverzeichnissen. Wie mache ich das, dass das Script für jedes Verzeichnis eine eigene Datei anlegt (also wohl nicht mehr richtig recursiv ist, obwohl irgendwie doch).

Jochen

Re: Inhalt + Dateiname speichern

#11 Post by Jochen »

Was verstehst Du unter "die Dateinamen werden nicht übernommen"? Wenn ich eine Datei mit Namen "gaga.desktop" habe und darin einen Eintrag "URL=ftp://hempel", dann erzeugt das Script (mittels Copy'n'Paste aus den Bowser übernommen, also keine Tippfehler) eine Datei "boomarks.html", die unter anderem auch die folgende Zeile enthält:<pre><BR><A HREF="ftp://hempel">./gaga.desktop</A></pre>Und dies macht dann aus dem Text ./gaga.html einen ftp-Link zu hempel.

Was möchtest Du da anders haben?

Max Moritz Sievers

Re: Inhalt + Dateiname speichern

#12 Post by Max Moritz Sievers »

Ja, stimmt. Ich habe 3 Versionen von Euren Scripts aber nur das erste war ausführbar. Anscheinend wurde deshalb immer das ausführbare erste Script ausgeführt. Tut mir leid wegen der Verwirrung.

Aber wie mache ich das, dass das aktuelle Verzeichnis bearbeitet wird und eine HTML-Datei erstellt wird und danach für jeden Unterordner jeweils ein anderes?

Jochen

Re: Inhalt + Dateiname speichern

#13 Post by Jochen »

Nur in Kurzform:
<li>Ersetze in obigem Skript die Zeile, die mit find beginnt, durch<pre>awk '<i>gleiches awk-Prog wie oben</i>' *.desktop >>bookmarks.html</pre>Nennen wir es einfach "mkmybookmark".

<li>Bastel ein zweites Skript, dass das obere aufruft:<pre>find . -name "*.desktop" -type f | while read DATEI ; do
( cd `dirname "$DATEI"` ; mkmybookmark )
done</pre>Achte auf die unterschiedlichen Anführungszeichen! Am besten, Du arbeitest mit Cut'n'Paste.

OK so? Mein Programmierhonorar schicke ich Dir dann per EMail zu! <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Max Moritz Sievers

Re: Inhalt + Dateiname speichern

#14 Post by Max Moritz Sievers »

Ich brauch so ein Programm für die Schule. Meine Lehrer benutzen nämlich alle keinen Konqueror. Da schien mir die beste Lösung, meine Bookmarks in je eine HTML-Datei zu schreiben. Wir wollen unseren Webauftritt erheblich verbessern und dafür müssen wir auch Links austauschen. Also ist deine Arbeit irgendwie für einen guten Zweck. Auch wenn ich vielleicht dafür gelobt werde (glaube ich kaum), weiß zumindest ich und du wem ich es zu verdanken habe. Ich werden mir morgen den aktuellen Linux-user kaufen, die einen Kurs zur Shell-Programmierung drin haben, damit ich mal etwas mehr Ahnung bekomme, was diese Befehle bedeuten.

Das neue Script funktioniert ohne Probleme (bis auf dass es keine Leerzeichen in Verzeichnisnamen mag, aber die lassen sich ja ändern). Mit etwas Handarbeit kann ich die "bookmarks.html"-Dateien der Verzeichnisse entsprechend umbenennen und in den HTML-Dateien die anderen "Verzeichnis-bookmarks.html"-Dateien so linken, dass man von der "höchsten" sich bis zur "niedrigsten" Datei durchklicken kann.

Ganz toll wäre es, wenn das auch automatisch gehen würde, aber das ist nicht so eilig und das kann ich auch irgendwann mal herausfinden. Wenn ich das Scipt soweit habe, werde ich es hier posten.

Vielen Dank nochmal.

Max Moritz Sievers

Post Reply