Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Dateien mit bestimmten Inhalt auflisten

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
micbur



Anmeldungsdatum: 05.06.2004
Beiträge: 86

BeitragVerfasst am: 24. Aug 2005 15:51   Titel: Dateien mit bestimmten Inhalt auflisten

Hallo,

ich probiere hier schon seit Stunden mit find rum.
Ich möchte mir gerne eine Liste von Dateien (absoluter Pfad) anzeigen lassen, die einen bestimmten Inhalt haben.

Momentan suche ich alle *.htm* Dateien, mit dem Suchkriterium '<!--MDV'.

Kann mir da bitte jemand weiter helfen. Ich bekomme das einfach nicht hin.
In Stichproben sind auch Dateien dabei gewesen, die nicht <!--MDV enthielten und die Pfadangabe ist auch noch nicht absolut.

Wäre echt schön, wenn mir jemand einen kleinen Hinweis geben könnte.
Vielen Dank, micbur
 
Benutzer-Profile anzeigen Private Nachricht senden

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 24. Aug 2005 17:34   Titel:

Code:
find . -name *.htm -exec grep -l '<!--MDV' {} \; | awk "{ sub(\".\", \"$PWD\"); print }"


durchsucht den aktuellen Pfad rekursiv und zeigt die Dateinamen, welche auf ".htm" enden an, welche die Zeichenkette enthalten. Das kleine awk-Skript dahinter, ersetzt den ersten Punkt im Dateinamen durch den aktuellen Pfad.

edit: Ich dachte eigentlich, dass find eine Option hätte, den vollen Pfad anzuzeigen, dann würde sich das awk-Skript erledigen, habe aber leider nichts gefunden.
 
Benutzer-Profile anzeigen Private Nachricht senden

kanonenfutter



Anmeldungsdatum: 10.09.2004
Beiträge: 266

BeitragVerfasst am: 24. Aug 2005 19:07   Titel:

oder halt einfach
Code:
grep -rl "<!--MDV" *.htm

_________________
"Email und Internet haben gemeinsam, dass sie beide in HTML geschrieben sind" (Peter Huth, TV-Computerexperte). Zitiert nach http://www.antihuth.de/
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

micbur



Anmeldungsdatum: 05.06.2004
Beiträge: 86

BeitragVerfasst am: 25. Aug 2005 8:28   Titel:

Hallo,

vielen Dank.
Ich hatte auch ins Manual von find geschaut und habe dann mit der Option 'printf' rumgespielt.

Vielleicht interessiert euch meine Ausgabe:
Code:

[user@host /dir]# find . -name *.htm -exec grep -rl "\<!--MDV" *.htm
-bash: !--MDV": event not found


letztlich habe ich es mit der langen Befehlsfolge probiert. Das hat auch funktioniert.
Code:

find . -name *.htm -exec grep -l 'MDV' {} \; | awk "{ sub(\".\", \"$PWD\"); print }"
 
Benutzer-Profile anzeigen Private Nachricht senden

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 25. Aug 2005 14:17   Titel:

Hi allerseits!

Fehlermeldung:
Zitat:
-bash: !--MDV": event not found
Das "!" ist das Zeichen für die History Expansion (unter dieser Überschrift in der bash-Manpage zu finden). So wird z.B. !$ als "letztes Wort des letzten Kommandos" ausgewertet:
Code:
mkdir -p /ein/ganz/tief/geschachteltes/verzeichnis
cd !$
Mit dem cd-Kommando wird in das gerade frisch erstellte Verzeichnis gewechselt. Wenn man diese History Expansion nicht braucht/möchte, hat man 2 Möglichkeiten. Man entwertet das ! mittels vorgestelltem Backslash (\!) oder mittels Apostrophen ('!') oder man schaltet mittels "set +H" die History Expansion ganz aus. Die Fehlermeldung kannst Du also beispielsweise so umgehen:
Code:
find . -name *.htm -exec grep -l '<!--MDV' *.htm
In einem Skript würde die Fehlermeldung sowieso nicht auftauchen, da nicht interaktive Shells die History Expansion per Default ausgeschaltet haben.

Absoluter Pfad bei find:
Wenn man von find eine volle Pfadangabe haben möchte, muss man ihm auch sagen, dass man eine möchte. Nur geht das nicht über eine Option, sondern über die Art, wie man find sagt ab welchen Verzeichnissen er zu arbeiten hat. Schreibt man
Code:
cd /tmp
find . -type f -print
dann erhält man relative Pfadnamen, da das erste Argument zu find, also das Verzeichnis, ab dem find arbeiten soll, relativ angegeben wurde. Schreibt man statt dessen
Code:
find /tmp -type f -print
so gibt find auch absolute Pfadnamen aus. Möchte man nun "ab dem aktuellen Verzeichnis absolute Pfadnamen" erreichen, geht das auch:
Code:
find $PWD -type f -print
find `pwd` -type f -print
Die erste Variante funktioniert in der bash oder ksh, die zweite auch in der alten sh.

Tuning:
Bei "find .... -exec ... \;" ist mir immer ein bisschen unwohl. Wenn man Verzeichnisbäume rekursiv durchsucht, muss man mit vielen Treffern rechnen. Und für jeden einzelnen Treffer wird wiederum ein eigenes grep-Kommando gestartet - möglicherweise bei 1000 Dateien also 1000 Prozesse. Mittels "xargs" kann man das viel effektiver gestalten:
Code:
find $PWD -name "*.htm" -print0 | xargs -0r grep -l '<!--MDV'
find liefert wie o.a. die gewünschten Dateien und gibt deren Namen in die Pipeline aus. Zwischen die Namen werden Nullbytes als Trenner gesetzt (-print0). xargs erwartet das auch so, weil wir die Option -O gesetzt haben. Er nimmt die Liste von Dateien und setzt sie als Argumentliste für das grep-Kommando zusammen. Sollte allerdings find keinen einzigen Treffer liefern, wird grep nicht gestartet (-r). Beispiel: Wenn find die Dateien

1.htm
2.htm
3.htm

liefert, setzt xargs daraus das Kommando
Code:
grep -l '<!--MDV' 1.htm 2.htm 3.htm
zusammen und startet es. Egal wieviele Treffer find liefert, es werden immer genau 3 Prozesse gestartet: find, xargs, grep. (Ja, ja, wenn es *sehr, sehr* viele Treffer sind, vielleicht auch mal 2 oder 3 greps. Aber das Prinzip stimmt.)

Ich hoffe, das hilft Dir noch ein bisschen weiter.

Jochen
_________________
Die grösste Lüge der EDV? "Mal eben..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy