ich verwende gerne "find ... -exec rm '{}' \;' um Dateien zu finden (und
dann zu loeschen). Dies geht wohl auch mit "... -print0 | xargs -0 rm"
und ich frage mich oft, was gegen die eine oder andere Variante spricht.
Vielmehr: wann sollte ich erstere Variante *nicht* einsetzen? Ich finde
im Netz dazu nicht wirklich viel, nur einen Thread[0], in dem behauptet
wird, dass "| xargs -0 rm" schneller waere, weil nur ein /bin/rm
aufgerufen wird. Dann verstehe ich aber nicht, wie hier das E2BIG
(Argument list too long) Problem umgangen wird.
Ist "-exec" evtl. nicht in allen find(1) Implementationen enthalten?
Thoughts?
Christian.
[0]https://www.zarb.org/pipermail/jpackage-discuss/2005-May/007975.html
--
BOFH excuse #164:
root rot
*lol*
Ich habe nichts gegen Deine Frage. Versteh mich nicht falsch, aber
mindestens einmal im Monat tritt jemand die exec-vs-xargs-Diskussion in
dieser Newsgroup los.
--
Best regards | "The only way to really learn scripting is to write
Cyrus | scripts." -- Advanced Bash-Scripting Guide
> Vielmehr: wann sollte ich erstere Variante *nicht* einsetzen?
Wenn find sehr viele Dateien findet.
Es geht aber auch:
find ... -exec rm '{}' +
Da wird auch rm weniger häufig aufgerufen.
> Ich finde
> im Netz dazu nicht wirklich viel, nur einen Thread[0], in dem behauptet
> wird, dass "| xargs -0 rm" schneller waere, weil nur ein /bin/rm
> aufgerufen wird. Dann verstehe ich aber nicht, wie hier das E2BIG
> (Argument list too long) Problem umgangen wird.
xargs (und auch die '+'-Variante) ist performanter, weil rm nur
dann aufgerufen wird, wenn die Zeile zu läng würde und natürlich
einmal am Schluss. Daher ist 'ein' falsch und 'wenige(r)' korrekt.
Dirk
Christian Kujau <ne...@nerdbynature.de> wrote:
> Vielmehr: wann sollte ich erstere Variante *nicht* einsetzen? Ich finde
> im Netz dazu nicht wirklich viel, nur einen Thread[0], in dem behauptet
> wird, dass "| xargs -0 rm" schneller waere, weil nur ein /bin/rm
> aufgerufen wird. Dann verstehe ich aber nicht, wie hier das E2BIG
> (Argument list too long) Problem umgangen wird.
Genau muss es heißen: "Ein oder mehrere, so wenig, wie möglich".
Somit wird nicht für jede Datei ein /bin/rm aufgerufen, das E2BIG aber
trotzdem umschifft.
Gruß,
Christian
--
....Christian.Garbs.....................................http://www.cgarbs.de
Wenn man alle tatsächlichen und real existierenden Gegebenheiten außer Acht
lässt, dann wäre es wirklich machbar. ;-) (Doc Sleeve in der AnimeGer)
Christian Kujau <ne...@nerdbynature.de> wrote:
> ich verwende gerne "find ... -exec rm '{}' \;' um Dateien zu finden (und
> dann zu loeschen). Dies geht wohl auch mit "... -print0 | xargs -0 rm"
> und ich frage mich oft, was gegen die eine oder andere Variante spricht.
Erstere Version funktioniert auf jedem SUSv3-konformen System, letzteres
AFAIK nur mit den (nicht ueberall installierten) GNU-Tools. In wirklich
SUSv3-konformen Umgebungen solltest du bei der ersten Verion die Performance
steigern koennen, indem du statt "\;" "+" verwendest ...
> Vielmehr: wann sollte ich erstere Variante *nicht* einsetzen?
So wie sie dort steht wird dabei fuer jeden einzelnen Dateinamen eine
Instanz von "rm" gestartet (was bei einer grossen Zahl von Dateien sehr
lange dauern und viel Resourcen schlucken kann), wenn du statt dessen
die Variante mit dem "+" verwendest, wird rm mit einer moeglichst maxi-
malen Zahl von PArametern gestartet, so dass die Anzahl der "rm" Aufrufe
erheblich niedriger und die gesamte Abarbeitung entsprechend resourcen-
schonender ist. Deine zweite Variante hat den selben Vorteil aber den
Nachteil "verminderter Portabilitaet", da die GNU-Tools moeglicherweise
nicht ueberrall installiert sind. Wenn die Version "find ... -exec rm {} +"
funktioniert, hat die Version mit "-print0" und "-0" demgegenueber keine
Vorteile.
> im Netz dazu nicht wirklich viel, nur einen Thread[0], in dem behauptet
> wird, dass "| xargs -0 rm" schneller waere, weil nur ein /bin/rm
> aufgerufen wird. Dann verstehe ich aber nicht, wie hier das E2BIG
> (Argument list too long) Problem umgangen wird.
Durch das "xargs" (da ja genau dafuer da ist).
> Ist "-exec" evtl. nicht in allen find(1) Implementationen enthalten?
Doch, aber aeltere find-Versionen koennen moeglicherweise das "+" statt
des "\;" bei find -exec nicht (obwohl es im SUS Standard enthalten ist).
Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname (auch wenn er Teil einer Mailadresse ist) ist nur ein Name,
nicht mehr und nicht weniger ...
damn :(
Also, das hatte ich mir halt irgendwie gedacht, dass das oft gefragt
wird, aber ich hab halt trotzdem nix gefunden, was das erklaert...sorry.
--
BOFH excuse #224:
Jan 9 16:41:27 huber su: 'su root' succeeded for .... on /dev/pts/1
Wow, ich wusste nicht, dass xargs bzw die "+" Variante so intelligent
ist, und erst erst vor Erreichen von E2BIG ein neues Kommando startet.
Toll, danke fuer die Erklaerung.
C.
Ah ja, in der manpage steht's ja auch drin (hab jetzt auch den -s switch
von xargs entdeckt)
Danke (an alle) fuer die ausfuehrlichen Erklaerungen. Ich hatte bei
meiner Lieblinsgsuchmaschine nur im "Web" gesucht und die Newsgroups
vergessen, jetzt sehe ich, dass dieses Thema wirklich oft am Start ist,
sorry :(
>> "find ... -exec rm '{}' \;'
>
> [...] funktioniert auf jedem SUSv3-konformen System
Jedes find kennt das - warum erwähnst Du speziell SUS?
> [...] aeltere find-Versionen koennen moeglicherweise das "+" statt
> des "\;" bei find -exec nicht (obwohl es im SUS Standard enthalten ist).
Was meinst Du mit "obwohl"? Traditionelle Implementationen haben
erstmal nichts mit SUS zu tun.