Hallo ML, Ich möchte im Dateisystem nach einer best. Zeichenfolge (Text) suchen. Wenn ich mit find / -type f -print -exec grep -Ii 'umount failed' {} \; suche, kommt die Suche genau bis zu /proc/kmsg Und bleibt dann stehen. Daher möchte ich /proc von der Suche ausschließen, was lt. Manpage mit -prune funktioniert. Das gelingt mir nicht. Egal, wo und wie ich -prune einfüge, immer kommt der Fehler: pc52842:/proc # find / -type f '/proc' -prune -print -exec grep -Ii 'umount failed' {} \; find: paths must precede expression Wie setze ich -prune richtig ein ? Bernd -- Bernd Lentes Systemadministration Institut für Entwicklungsgenetik HelmholtzZentrum münchen bernd.lentes@helmholtz-muenchen.de 089 3187 1241 http://www.helmholtz-muenchen.de/idg -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Lentes, Bernd, Mittwoch 15 April 2009:
pc52842:/proc # find / -type f '/proc' -prune -print -exec grep -Ii 'umount failed' {} \; find: paths must precede expression
Müßte das nicht eher # find / -type f -path '/proc' -prune Heißen? To ignore a whole directory tree, use -prune rather than checking every file in the tree. For example, to skip the directory `src/emacs' and all files and directories under it, and print the names of the other files found, do something like this: find . -path ./src/emacs -prune -o -print -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mittwoch, 15. April 2009 15:49 schrieb Lentes, Bernd:
Ich möchte im Dateisystem nach einer best. Zeichenfolge (Text) suchen. Wenn ich mit find / -type f -print -exec grep -Ii 'umount failed' {} \; suche, kommt die Suche genau bis zu /proc/kmsg Und bleibt dann stehen. Daher möchte ich /proc von der Suche ausschließen, was lt. Manpage mit -prune funktioniert. Das gelingt mir nicht. Egal, wo und wie ich -prune einfüge, immer kommt der Fehler: pc52842:/proc # find / -type f '/proc' -prune -print -exec grep -Ii 'umount failed' {} \; find: paths must precede expression
man liefert folgendes Beispiel: find . -path ./src/emacs -prune -o -print Beachte das Argument "-path" Grüße Ralf -- Antworten bitte nur in die Mailingliste! PMs bitte an: listpm (@) arndt-de (.) eu -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Ralf Arndt schrieb:
-----Ursprüngliche Nachricht----- Von: Ralf Arndt [mailto:sl1@arndt-de.eu] Gesendet: Mittwoch, 15. April 2009 16:17 An: opensuse-de@opensuse.org Betreff: Re: Grep und find
Am Mittwoch, 15. April 2009 15:49 schrieb Lentes, Bernd:
Ich möchte im Dateisystem nach einer best. Zeichenfolge (Text) suchen. Wenn ich mit find / -type f -print -exec grep -Ii 'umount failed' {} \; suche, kommt die Suche genau bis zu /proc/kmsg Und bleibt dann stehen. Daher möchte ich /proc von der Suche ausschließen, was lt. Manpage mit -prune funktioniert. Das gelingt mir nicht. Egal, wo und wie ich -prune einfüge, immer kommt der Fehler: pc52842:/proc # find / -type f '/proc' -prune -print -exec grep -Ii 'umount failed' {} \; find: paths must precede expression
man liefert folgendes Beispiel: find . -path ./src/emacs -prune -o -print Beachte das Argument "-path"
Grüße Ralf
Seltsam: find / -type f -path '/proc' -prune -o -print > ~/find.txt Greppe ich anschließend in find.txt nach /proc, wird er fündig. /proc sollte doch von der Suche ausgenommen sein, oder ? Bernd -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Wed 15 Apr 2009, Lentes, Bernd wrote:
find / -type f -path '/proc' -prune -o -print > ~/find.txt
So hier wird ein Schuh draus: find / -maxdepth 2 \( -path /proc -prune \) -o \( -type f -print \) Die find Kommandozeile ist folgendermaßen aufgebaut: find paths options tests_and_actions Zuerst gibst Du also mindestens einen Pfad an. Dann kommen Optionen, die die Operation als Ganzes beeinflussen, z.B. -maxdepth. Dann kommen Testbedingungen und Aktionen. Die Tests werden im Normalfall alle mit UND verbunden. Willst Du ein ODER, brauchst Du "-o". Damit hast Du aber ein Prioritätsproblem ähnlich dem der Arithmetik. Ist 3*2+5 nun 11 oder ist es 21? Das kannst Du mit Klammern lösen. Die Backslashes brauchst Du, weil die Klammern Spezialzeichen in der Shell sind. "\( -path /proc -prune \) -o \( -type f -print \)" bedeutet also ( -path /proc UND -prune ) ODER ( -type f UND -print ) Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Torsten Förtsch schrieb:
-----Ursprüngliche Nachricht----- Von: Torsten Foertsch [mailto:torsten.foertsch@gmx.net] Gesendet: Mittwoch, 15. April 2009 18:17 An: opensuse-de@opensuse.org Cc: Lentes, Bernd Betreff: Re: Grep und find
On Wed 15 Apr 2009, Lentes, Bernd wrote:
find / -type f -path '/proc' -prune -o -print > ~/find.txt
So hier wird ein Schuh draus:
find / -maxdepth 2 \( -path /proc -prune \) -o \( -type f -print \)
Die find Kommandozeile ist folgendermaßen aufgebaut:
find paths options tests_and_actions
Zuerst gibst Du also mindestens einen Pfad an. Dann kommen Optionen, die die Operation als Ganzes beeinflussen, z.B. -maxdepth. Dann kommen Testbedingungen und Aktionen.
Die Tests werden im Normalfall alle mit UND verbunden. Willst Du ein ODER, brauchst Du "-o". Damit hast Du aber ein Prioritätsproblem ähnlich dem der Arithmetik. Ist 3*2+5 nun 11 oder ist es 21? Das kannst Du mit Klammern lösen. Die Backslashes brauchst Du, weil die Klammern Spezialzeichen in der Shell sind.
"\( -path /proc -prune \) -o \( -type f -print \)" bedeutet also
( -path /proc UND -prune ) ODER ( -type f UND -print )
Torsten
Scheint auf den ersten Blick sehr logisch zu sein. Vielen Dank. Jetzt muss ich noch schauen, wie ich mein grep da hinein bekomme. Bernd-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Wed 15 Apr 2009, Lentes, Bernd wrote:
Jetzt muss ich noch schauen, wie ich mein grep da hinein bekomme.
find / \( -path /proc -prune \) -o \( -type f -print0 \) | xargs -0 grep STRING /dev/null Vergiß -exec! Das könntest Du zwar statt -print0 benutzen, es ist aber weniger effektiv. Mit -exec würdest Du für jedes File einen grep-Prozess starten. Xargs hingegen sammelt soviele Filenamen, bis die maximale Kommandozeilenlänge erreicht ist und startet dann einen grep. Sind mehrere Dateien auf der grep Kommandozeile angegeben, zeigt grep im Output immer den Filenamen mit an. Das ist sicher das, was Du willst, oder? Nun könnte es passieren, daß der letzte grep-Aufruf nur noch eine Datei kriegt. Um das zu vermeiden steht /dev/null als erstes Argument im grep-Aufruf. So hat er immer mindestens 2 Dateien zu greppen, wobei die erste leer ist. Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Torsten! On Mi, 15 Apr 2009, Torsten Foertsch wrote:
Vergiß -exec! Das könntest Du zwar statt -print0 benutzen, es ist aber weniger effektiv. Mit -exec würdest Du für jedes File einen grep-Prozess starten.
man find | less -p "-exec.*\+" Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 181. You make up words that go with the "happy tune" your modem makes while dialing your ISP. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Christian On Wednesday 15 April 2009 20:55:14 Christian Brabandt wrote:
Hi Torsten!
On Mi, 15 Apr 2009, Torsten Foertsch wrote:
Vergiß -exec! Das könntest Du zwar statt -print0 benutzen, es ist aber weniger effektiv. Mit -exec würdest Du für jedes File einen grep-Prozess starten.
man find | less -p "-exec.*\+"
ergibt bei mir <standard input>:92: cannot use newline as a starting delimiter (GNU bash, version 3.2.39(1)-release (i586-suse-linux-gnu) ??
Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 181. You make up words that go with the "happy tune" your modem makes while dialing your ISP.
-- Beste Grüße Christian Paul Why you can't find your system administrators: they're busy rerouting their support telephone to the luser of the day -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Christian! On Mi, 15 Apr 2009, Christian Paul wrote:
Hi Christian
On Wednesday 15 April 2009 20:55:14 Christian Brabandt wrote:
Hi Torsten!
On Mi, 15 Apr 2009, Torsten Foertsch wrote:
Vergiß -exec! Das könntest Du zwar statt -print0 benutzen, es ist aber weniger effektiv. Mit -exec würdest Du für jedes File einen grep-Prozess starten.
man find | less -p "-exec.*\+"
ergibt bei mir <standard input>:92: cannot use newline as a starting delimiter
(GNU bash, version 3.2.39(1)-release (i586-suse-linux-gnu)
??
,----[ man find | grep -A 8 -m 1 "-exec.*+" ]- | -exec command {} + | This variant of the -exec action runs the specified command on | the selected files, but the command line is built by appending | each selected file name at the end; the total number of invoca- | tions of the command will be much less than the number of | matched files. The command line is built in much the same way | that xargs builds its command lines. Only one instance of ‘{}’ | is allowed within the command. The command is executed in the | starting directory. `---- Sprich find verhält sich bei -exec + ähnlich wie xargs und es wird nicht mehr für jeden Fund ein Prozes gestartet. Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 182. You may not know what is happening in the world, but you know every bit of net-gossip there is. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mit, 15 Apr 2009, Torsten Foertsch schrieb:
On Wed 15 Apr 2009, Lentes, Bernd wrote:
Jetzt muss ich noch schauen, wie ich mein grep da hinein bekomme.
find / \( -path /proc -prune \) -o \( -type f -print0 \) | xargs -0 grep STRING /dev/null [..] Sind mehrere Dateien auf der grep Kommandozeile angegeben, zeigt grep im Output immer den Filenamen mit an. Das ist sicher das, was Du willst, oder? Nun könnte es passieren, daß der letzte grep-Aufruf nur noch eine Datei kriegt. Um das zu vermeiden steht /dev/null als erstes Argument im grep-Aufruf. So hat er immer mindestens 2 Dateien zu greppen, wobei die erste leer ist.
man xargs! :P | xargs -r -0 grep STRING | xargs --no-run-if-empty -0 grep STRING Und mit aktuellen GNU find geht (endlich) auch die BSD-Syntax find ... -exec ... + was ebenfalls die Kommandozeile "auffüllt". Und da -print0 / xargs -0 auch GNUismen sind ist's egal. -dnh -- Indifference will be the downfall of mankind, but who cares? -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
-----Ursprüngliche Nachricht----- Von: Torsten Foertsch [mailto:torsten.foertsch@gmx.net] Gesendet: Mittwoch, 15. April 2009 20:23 An: opensuse-de@opensuse.org Cc: Lentes, Bernd Betreff: Re: Grep und find
On Wed 15 Apr 2009, Lentes, Bernd wrote:
Jetzt muss ich noch schauen, wie ich mein grep da hinein bekomme.
find / \( -path /proc -prune \) -o \( -type f -print0 \) | xargs -0 grep STRING /dev/null
Vergiß -exec! Das könntest Du zwar statt -print0 benutzen, es ist aber weniger effektiv. Mit -exec würdest Du für jedes File einen grep-Prozess starten. Xargs hingegen sammelt soviele Filenamen, bis die maximale Kommandozeilenlänge erreicht ist und startet dann einen grep.
Sind mehrere Dateien auf der grep Kommandozeile angegeben, zeigt grep im Output immer den Filenamen mit an. Das ist sicher das, was Du willst, oder? Nun könnte es passieren, daß der letzte grep-Aufruf nur noch eine Datei kriegt. Um das zu vermeiden steht /dev/null als erstes Argument im grep-Aufruf. So hat er immer mindestens 2 Dateien zu greppen, wobei die erste leer ist.
Hallo, Was wäre so schlimm, wenn der letzte grep-Aufruf nur eine Datei bekommt ? Bernd-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Torsten Förtsch schrieb:
"\( -path /proc -prune \) -o \( -type f -print \)" bedeutet also
( -path /proc UND -prune ) ODER ( -type f UND -print )
Torsten
Hat denn bei find die UND-Verknüpfung nicht eine höhere Priorität als die ODER-Verknüpfung, im Sinne von Punktrechnung vor Strichrechnung ? In der Digitaltechnik ist das so. Bernd-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mit, 15 Apr 2009, Lentes, Bernd schrieb:
Torsten Förtsch schrieb:
"\( -path /proc -prune \) -o \( -type f -print \)" bedeutet also [..] Hat denn bei find die UND-Verknüpfung nicht eine höhere Priorität als die ODER-Verknüpfung, im Sinne von Punktrechnung vor Strichrechnung ?
Ja. Allerdings schaden die Klammern nicht. -path /proc -prune -o -type f -print macht das gleiche wie mit Klammern. HTH, -dnh -- Vor einiger Zeit gab es mal einen Test Cygwin gegen nativ portierte UNIX-Utilities auf NT. Es war einfach nicht mehr lustig. Andererseits: mit _irgendwas_ muessen die 2 GHz des XTerminals doch beschaeftigt werden, die 200 MHz des Server arbeiten schliesslich auch fuer ihr Geld. -- A. Schreiber -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Bernd, Am Mittwoch 15 April 2009 15:49:19 schrieb Lentes, Bernd:
Wie setze ich -prune richtig ein ?
vll. so: find / -type f -prune '/proc' -print -exec grep -Ii 'umount failed' {} \; erst der Schalter dann der dazugehörige parameter, so wie immer halt. Gruss Falk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mit, 15 Apr 2009, Falk Sauer schrieb:
find / -type f -prune '/proc' -print -exec grep -Ii 'umount failed' {} \;
erst der Schalter dann der dazugehörige parameter, so wie immer halt.
Nein. RTFM. -prune ist eine Aktion wie -print oder -exec. -dnh -- It's so nice to be insane, no one asks you to explain! -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Lentes, Bernd [15.04.2009 15:49]:
Hallo ML,
Ich möchte im Dateisystem nach einer best. Zeichenfolge (Text) suchen. Wenn ich mit find / -type f -print -exec grep -Ii 'umount failed' {} \; suche, kommt die Suche genau bis zu /proc/kmsg Und bleibt dann stehen. Daher möchte ich /proc von der Suche ausschließen, was lt. Manpage mit -prune funktioniert. Das gelingt mir nicht. Egal, wo und wie ich -prune einfüge, immer kommt der Fehler: pc52842:/proc # find / -type f '/proc' -prune -print -exec grep -Ii 'umount failed' {} \; find: paths must precede expression
Wie setze ich -prune richtig ein ?
Bernd
Hallo Bernd, nach tiefem Studium der Manpage ;-) habe ich zwei Zeilen getestet: a) find / -mount -maxdepth 1 -type d -path /proc -prune gibt netterweise exakt die Zeile /proc aus b) find / -mount -maxdepth 1 -type d -path /proc -prune -o -print gibt alle Verzeichnisse unterhalb / *außer /proc* aus Wäre auf Dein Beispiel bezogen wohl find / -type f -path /proc -prune -o -print ... evtl. auch ... -prune -o exec ... oder -o print | xargs ..., das müsstest Du mal ausprobieren. HTH Werner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Wednesday 15 April 2009 15:49:19 schrieb Lentes, Bernd:
Hallo ML,
Ich möchte im Dateisystem nach einer best. Zeichenfolge (Text) suchen. Wenn ich mit find / -type f -print -exec grep -Ii 'umount failed' {} \; suche, kommt die Suche genau bis zu /proc/kmsg Und bleibt dann stehen. Daher möchte ich /proc von der Suche ausschließen, was lt. Manpage mit
ich würds mit "! -path" machen. also so: find / -type f ! -path /proc -exec grep -il 'umount failed' {} \; -- einen schönen Tag noch DI Rainer Klier /(bb|[^b]{2})/ that's the question Und bitte keine TOFU-Mails (http://de.wikipedia.org/wiki/TOFU) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (10)
-
Andre Tann
-
Christian Brabandt
-
Christian Paul
-
David Haller
-
Falk Sauer
-
Lentes, Bernd
-
Rainer Klier
-
Ralf Arndt
-
Torsten Foertsch
-
Werner Flamme