Archiv verlassen und diese Seite im Standarddesign anzeigen : find -exec / xargs Frage
Guten Abend,
ich habe eine Frage bezüglich des Komandos find
man kann ja find mittels -exec foo sagen das es Befehl foo ausführen soll, also z.b:
find / -name foo -exec rm {} \;
allerdings gibt es auch folgende Lösung:
find / -name foo -print0 | xargs -0 -r rm
beide erfüllen die selbe Funktion, welche ist nun der "bessere" Weg wenn man das so pauschal sagen kann, was ich bezweifle.
Ich habe dazu viele wiedersprüchliche Aussagen gefunden, deswegen Frage ich hier mal explizit welches sind jeweils die Vor- bzw Nachteile der beiden Komandos?
mfg x-byte
peschmae
11-02-2008, 21:53
Moin und willkommen im Forum!
Naja, in dem Falle würde ich den ersten Aufruf verwenden weil der einen Prozess weniger benötigt (und damit vermutlich schneller/ressourcensparender ist).
Auch wenn das im konkreten Fall nicht wirklich relevant ist.
Da beides funktioniert ist beides gut; besser gibts nicht. Nur geht und geht nicht. ;)
MfG Peschmä
Moin,
...Naja, in dem Falle würde ich den ersten Aufruf verwenden weil der einen Prozess weniger benötigt (und damit vermutlich schneller/ressourcensparender ist).
Auch wenn das im konkreten Fall nicht wirklich relevant ist....
nö, das ist genau andersrum. Der exec startet je Fundstelle einen Child, xargs bündelt und gibt die maximal mögliche Anzahl an Argumenten an jeweils einen rm weiter. Variante 2 ist also in den meisten Fällen deutlich ressourcenschonender.
2. Vorteil der 2. Variante: Die kommt mit jedem Dateinamen klar, auch mit Zeilenumbrüchen, Leerzeichen usw., der exec in dieser Form nicht (und das wird auch einiges Gefummel, da ist xargs -0 viel einfacher zu handhaben).
exec ist nur dann von Vorteil, wenn man ein Kommando ausführen will, dass mit der Argument-Anordnung des xargs nicht klarkommt:
jan@jack:~/tmp> find . -name '*.sh' -exec basename {} .sh \;
img_repl
chk_getopts
sl
...
jan@jack:~/tmp> find . -name '*.sh' -print0 | xargs -0 basename .sh
basename: zu viele Argumente
„basename --help“ gibt weitere Informationen.
Jan
Hallo,
danke schon mal für die Antworten.
Ich habe mich auch anderweitig ein wenig schlau gemacht und folgrendes herausgefunden:
Es ist wie jan61 schon sagte besser das mit xargs zu machen, weil dann die Argumente gesammelt werden und nicht für jedes Argument eine neue rm instanz aufgemacht wird.
Es gibt allerdings auch eine Lösung mit find, die sogar POSIX konform ist ( denn das ist xargs nicht) , auf Unix Systemen wird das auch schon lange so gemacht, nur GNU Find kann es wohl erst seit Version 4/4.1/4.2,
find / -name foo -exec rm {} +
Man beachte das +, das bewirkt das es quasi wire bei xargs aufgerufen wird, es wird nämlich erst gesammelt und dann eine rm instanz mit den gesammelten Argumenten gestartet.
Sprich, auf Linux Systemen fährt man momentan mit xargs besser, weil man nicht sicherstellen kann das es find in entsprechender Version gibt, auf anderen UNIXen fährt man mit find besser, weil es xargs da nicht gibt bzw nicht sichergestellt werden kann das es vorhanden ist (es gibt wohl auch einige unix implementierengen.)
So nun habe ich mir selbst geholfen, und hoffentlich auch ewinigen anderen.
Gruß x-byte
peschmae
13-02-2008, 13:52
nö, das ist genau andersrum. Der exec startet je Fundstelle einen Child, xargs bündelt und gibt die maximal mögliche Anzahl an Argumenten an jeweils einen rm weiter. Variante 2 ist also in den meisten Fällen deutlich ressourcenschonender.
Oh, stimmt. Eigentlich wusste ich das ja, dann hab ichs getestet und dummerweise dafür einen Ordner mit 100 Dateien drin erstellt; dann in Folge nicht ganz genau auf den ps -e Output geguckt und schon erzähle ich kompletten Blödsinn :D
MfG Peschmä
Moin,
...Es gibt allerdings auch eine Lösung mit find, die sogar POSIX konform ist ( denn das ist xargs nicht) , auf Unix Systemen wird das auch schon lange so gemacht, nur GNU Find kann es wohl erst seit Version 4/4.1/4.2,
find / -name foo -exec rm {} +
Das ist interessant, das kannte ich noch gar nicht - mein find in Version 4.1.7 allerdings auch nicht ;-) Ich war interessiert und habe mal auf unseren SUN-Kisten geguckt: Sowohl Solaris8 als auch Solaris10 kennen das "+", in der Man-Page taucht es aber erst bei der 10er Version auf. Und zum xargs: Das liegt warm und weich unter /usr/bin auf beiden Sparcs. Mal sehen, vielleicht denke ich dran und schaue nachher mal auf einer AIX nach, da komme ich von hier aus leider nicht ran.
Jan
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.