Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

find -exec rm vs. xargs rm

421 views
Skip to first unread message

Christian Kujau

unread,
Aug 26, 2007, 10:01:14 AM8/26/07
to
Hi,

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

Cyrus Kriticos

unread,
Aug 26, 2007, 10:49:36 AM8/26/07
to
Christian Kujau 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.

*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

Dirk Clemens

unread,
Aug 26, 2007, 10:56:42 AM8/26/07
to
Christian Kujau wrote:
> Hi,
>
> 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.
>
Es ist eine Performance-Frage:
Bei der ersten Variante wird für jede Datei ein eigener rm-Prozess
erzeugt, in der 2. Variante werden nur wenige rm-Prozess erzeugt
(Stichpunkt: maximale Kommandozeilenlänge).

> 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 Garbs

unread,
Aug 26, 2007, 11:23:14 AM8/26/07
to
Mahlzeit!

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)

Juergen Ilse

unread,
Aug 26, 2007, 4:32:33 PM8/26/07
to
Hallo,

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 ...

Christian Kujau

unread,
Aug 26, 2007, 5:33:51 PM8/26/07
to
On Sun, 26 Aug 2007, Cyrus Kriticos wrote:
> 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

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

Christian Kujau

unread,
Aug 26, 2007, 5:51:05 PM8/26/07
to
On Sun, 26 Aug 2007, Dirk Clemens wrote:
> 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.

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.

Christian Kujau

unread,
Aug 26, 2007, 6:06:06 PM8/26/07
to
On Sun, 26 Aug 2007, Juergen Ilse wrote:
[good stuff snipped]

>> 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).

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 :(

Sven Mascheck

unread,
Aug 27, 2007, 4:11:38 AM8/27/07
to
Juergen Ilse wrote:
> Christian Kujau <ne...@nerdbynature.de> wrote:

>> "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.

0 new messages