Martin Schmitt sagte:
> * [EMAIL PROTECTED] wrote/schrieb:
>
>> kann mir jemand schnell ein Beispiel geben
>> wie ich die find Option -exec benutze?
>> z.B. ich brauchs f�r grep, mv und  cp.
>> .. da gabs doch auch was mit xarg...
>
> Ich mach das immer so: find / -name "foo" -type f | xargs grep "bar"

-exec grep "bar" {} \; hat das Problem, dass es den Dateinamen
nicht ausgibt.  xargs k�nnte bei der letzten Datei das Problem
auch haben (wenn nur noch eine Datei zu bearbeiten ist).  Als
Abhilfe kann man "| xargs grep 'bar' /dev/null" nehmen.  Dann werden
immer mindestens zwei Dateien durchsucht...

Eine nette Option ist noch -ok, das funktioniert wie -exec, nur
dass vor dem Start des Befehls nachgefragt wird.

Performance: -exec startet das Programm (hier grep) f�r jede
gefundene Datei, xargs nur so viele, dass die Kommandozeile
nicht �berl�uft.  Die Alternative
grep "bar" $(find . -name "foo")
kann ein "Command line too long" verursachen, deshalb der xargs.

> Es geht auch mit "-exec", aber ich habe da noch keine "merkbare"
> Erkl�rung bekommen, welche Zeichen auf welche Weise escaped werden
> m�ssen. Anstatt da lange rumzugr�beln, nehme ich immer xargs.

Der Befehl hinter -exec wird mit ";" abgeschlossen.  Das w�rde die
Shell fressen (Probiere "echo a; echo b"), daher ein \ davor.
Das ist eigentlich alles.

Die xargs L�sung geht schief, wenn Du einen Dateinamen mit
einem Linefeed im Namen hast.  GNU find hat daf�r die Option
-print0 und xargs die Option -0.  Damit werden die Dateinamen
durch Hex-0 getrennt, und das kann in keinem Dateinamen enthalten sein.

Jochen

-- 
This space is intentionally left blank.


----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org

Antwort per Email an