Bash: Argumentliste zu lang

Hi,

wie’s mir scheint habe ich durch einen Programmierfehler enorm viele Dateien erzeugt, so viele, daß bash es nicht mehr mag. Gibt’s dazu 'nen workaround anders als viele, viele Einzellöschaktionen?

:~/\> rm gray\_????\_TI\*bmp
bash: /bin/rm: Die Argumentliste ist zu lang

Beste Grüße,
Ingo

Hallo,

Gibt’s dazu 'nen workaround anders als viele, viele
Einzellöschaktionen?
rm gray_???_TI*bmp

mit xargs für jede Datei rm einzeln aufrufen:

find . -name 'gray\_????\_TI\*bmp' | xargs rm


Philipp

Hallo nochmal,

find . -name 'gray\_????\_TI\*bmp' | xargs rm

sicherheitshalber noch die Anmerkung: das findet und löscht jetzt auch Dateien derartigen Namens in Unterverzeichnissen - da sollte man find vielleicht ein

-maxdepth 1

mitgeben.


Philipp

Salut,

find . -name ‚gray_???_TI*bmp‘ | xargs rm

sicherheitshalber noch die Anmerkung: das findet und löscht
jetzt auch Dateien derartigen Namens in Unterverzeichnissen -
da sollte man find vielleicht ein

-maxdepth 1

mitgeben.

Ah, danke, das hilft. -maxdepth 1 ist in diesem Fall egal (da ich auf der untersten Verzeichnisebene bin), aber i.A. sicher sehr nützlich.

Gruß,
Ingo

Hallo,

Gibt’s dazu 'nen workaround anders als viele, viele
Einzellöschaktionen?
rm gray_???_TI*bmp

mit xargs für jede Datei rm einzeln aufrufen:

find . -name ‚gray_???_TI*bmp‘ | xargs rm

Das tut zwar was es soll, aber nicht das, was du beschrieben hast :wink:

xargs übergibt erzeugt erst mal nur ein rm, und wenn die Kommandozeile zu lange wird, startet es ein neues rm. Dadurch werden ingesamt weniger Prozesse gestartet, ist also effizienter.

Wenn man wirklich für jede Datei rm einzeln aufrufen will, kann man das so machen:

find . -name 'gray\_???\_TI\*bmp' -exec rm {} \;

Grüße,
Moritz

2 Like
> > find . -name 'gray\_????\_TI\*bmp' | xargs rm

Das ist aber baeh, weil es auch auf den Dateinamen (und ich verwende bewusst die Einzahl)

gray\_ab c\_TIlaber
zeugs.bmp

matcht und rm weder gray_ab noch c_TIlaber noch zeugs.bmp finden wird. Ich empfehle hierfuer grundsaetzlich den Einsatz von -print0 fuer’s find und -0 fuer’s xargs.

Das tut zwar was es soll, aber nicht das, was du beschrieben
hast :wink:

Wenn man wirklich für jede Datei rm einzeln aufrufen will,
kann man das so machen:

> find . -name 'gray\_???\_TI\*bmp' -exec rm {} \;

Und welchen sinnvollen Gund sollte es dafuer geben?

Gruss vom Frank.

1 Like
> > find . -name 'gray\_???\_TI\*bmp' -exec rm {} \;

Und welchen sinnvollen Gund sollte es dafuer geben?

PID size war!

Hallo,

find . -name ‚gray_???_TI*bmp‘ | xargs rm

Das ist aber baeh, weil es auch auf den Dateinamen (und ich
verwende bewusst die Einzahl)

gray_ab c_TIlaber
zeugs.bmp

matcht und rm weder gray_ab noch c_TIlaber
noch zeugs.bmp finden wird.

Richtig, aber in diesem Fall wohl irrelevant.

Ich empfehle hierfuer
grundsaetzlich den Einsatz von -print0 fuer’s find und -0
fuer’s xargs.

Dagegen ist nichts einzuwenden.

Wenn man wirklich für jede Datei rm einzeln aufrufen will,
kann man das so machen:

find . -name ‚gray_???_TI*bmp‘ -exec rm {} ;

Und welchen sinnvollen Gund sollte es dafuer geben?

Z.B. wenn man nichts von -print0 weiß, oder bei anderen Programmen als rm, die nur ein Argument erwarten (perl z.B. führt pro Aufruf nur ein Script auf).

Grüße,
Moritz

Salut,

ich muß sagen, es wird interessant :smile:.

find . -name ‚gray_???_TI*bmp‘ | xargs rm

Das ist aber baeh, weil es auch auf den Dateinamen (und ich
verwende bewusst die Einzahl)

gray_ab c_TIlaber
zeugs.bmp

matcht und rm weder gray_ab noch c_TIlaber
noch zeugs.bmp finden wird. Ich empfehle hierfuer

Uh… Da mir solch Kram schon viel zu häufig über den Weg gelaufen ist, versuche ich Leerzeichen soweit als möglich in Dateinamen zu meiden :smile:. Über genau solche Probleme bin ich schon häufiger gestolpert…

grundsaetzlich den Einsatz von -print0 fuer’s find und -0
fuer’s xargs.

Das tut zwar was es soll, aber nicht das, was du beschrieben
hast :wink:

Wäre mir so nicht aufgefallen. Versuche ich mir auch 'mal zu merken. Merci

Wenn man wirklich für jede Datei rm einzeln aufrufen will,
kann man das so machen:

find . -name ‚gray_???_TI*bmp‘ -exec rm {} ;

Auch dafür danke.

Gruß,
Ingo