[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Regular Expression bei Dateiendungen mit find



On Tue, Aug 22, 2006 at 10:06:36AM +0200, Gebhard Dettmar wrote:
> Aber ich kapiere find -regex eh nicht so ganz. Ich habe Dateien wie 
> geb.jpg, gebI.jpg, gebII.jpg usw. find -regex "geb.*" matcht die nicht, da 
> muss noch ein ".*" davor, also ".*geb.*" Nehme an, das liegt daran, dass 
> find bei der Ausgabe immer noch ein ./ vor Dateien, die im 
> Aufrufverzeichnis liegen, stellt.

Jein. find gibt ein "./" nur dann aus, wenn Du sagst "find . -op" oder
"find -op" ohne Directories. Wenn Du "find *" sagst, gibt's kein "./"
davor, aber Du findest trotzdem nicht unbedingt das, was Du suchst.

Ein Blick in die Manpage zu find(1) hilft Dir. Da steht zu "-regex"

  This is a match on the whole path, not a search. For example, [...]

Das heisst soviel wie: das Pattern wird implizit verankert mit einem "^" am
Anfang und mit einem "$" am Ende des Strings, also "-regex a" findet nicht
alle Files, die ein "a" im Namen enthalten, sondern nur die, die exakt "a"
heissen (incl. Directories im Path).

Um also alle Files zu finden, die mit "a" anfangen, muss man mittels

  find . -regex '.*/a.*'

suchen. Ist ungewohnt, steht aber eindeutig so in der Dokumentation. Das
funktioniert analog zum match-Operator in expr(1), der das schon seit eh
und je so macht.

Sinnvoller ist, wie schon andere sagten, statt dessen klassisch mit grep
oder egrep zu arbeiten:

  find . | grep '/a'

oder

  find . | egrep -i 'jpe?g$'

BTW: sehr hilfreich ist auch das Modul File::Find von Perl, mit dem man
beliebige Operationen waehrend der Traversierung eines Verzeichnisses
ausfuehren kann.

	--jc

-- 
  Ignorance more frequently begets confidence than does knowledge.
	-- Charles Darwin



Reply to: