Mailinglist Archive: opensuse-de (917 mails)

< Previous Next >
Re: Dateien suchen und kopieren (regex)
  • From: Al Bogner <suse-linux@xxxxxxxxxxxxxxxxxxxx>
  • Date: Mon, 10 May 2010 22:18:19 +0200
  • Message-id: <201005102218.20177.suse-linux@xxxxxxxxxxxxxxxxxxxx>
Am Montag 10 Mai 2010 21:42:36 schrieb Christian Brabandt:

Hallo Christian,

On Mo, 10 Mai 2010, Al Bogner wrote:
Am Montag 10 Mai 2010 20:36:58 schrieb Christian Brabandt:

Hallo Christian,

On Mo, 10 Mai 2010, Al Bogner wrote:
Am Montag 10 Mai 2010 11:17:09 schrieb Christian Brabandt:
On Mon, May 10, 2010 10:59 am, Thomas Moritz wrote:
Am Montag, 10. Mai 2010 08:18:49 schrieb Christian Brabandt:
On So, 09 Mai 2010, Al Bogner wrote:
Es geht darum, dass Dateien in ein neues Verzeichnis kopiert
werden sollen, wenn der Ordner eine bestimmte Zeichenkette
enthält und der Dateiname zwischen Anfang und dem ersten "-"
einen Punkt enthält und die Endung txt ist.

Beispiel:

/dir1/dir2/dir3/abcdef/dir5/1.2-irgendwas.txt
/dir1/dir2//abcd/dir4/03.11nochwas.txt
/dir1/dir2/dir3/abcdef/dir5/1-irgendwasanderes.txt

Demnach sollen also die ersten beiden Dateien gefunden werden,
wenn nach einem "Directory-Inhalt" mit bc gesucht wird, der 3.
darf nicht gefunden werden, da da vor dem "-" kein Punkt ist.

find . -path '*bc*' -iregex '.*/[^./-]*\.[^/-]*-.[^/]*\.txt$'

Das passt aber nicht auf solchen Muell wie:
1.23.-a.a-a.txt
1.23.aaa.aaa-.txt

auf die erste schon. Der 2. matcht nur nicht, weil da in der RE
noch ein Bug drin ist. Es müsste also eigentlich heißen:

-iregex '.*/[^./-]*\.[^/-]*-[^/]*\.txt$'

(Man beachte den fehlenden Punkt, der verhinderte, dass auf einen
Binde- strich das .txt folgen darf).

Ich habe das gerade mit einem Testverzeichnis probiert, sieht ganz
gut aus, hat aber noch einen vernachlässigbaren Fehler, wenn "bc" im
Dateinamen vorkommt aber _nicht_ in einem Verzeichnis, dann wird das
auch gefunden. In der Praxis ist das vernachlässigbar, aber
vielleicht kann man das noch verbessern.

Dann pack explizit den Verzeichnistrenner in -path rein. Also so hier:
find . -path '*bc*/*' -iregex …

Ja, so funktioniert das, ich kämpfe nur noch mit der Suche als Variable

find /home/ -path '*$1*/*' -iregex '.*/[^./-]*\.[^/-]*-[^/]*\.txt$'

Ich nehmen an, es liegt an ' von '*bc*'. Nur, ob ich die ' einfach
weglassen kann, bin ich mir nicht klar. Es scheint aber zu funktionieren.

Nein, solltest Du nicht, das fliegt Dir um die Ohren, wenn Du
Leerzeichen in $1 hast. Mach sowas:

Wenn ich das sehe, sieht es ja logisch aus ;-) Ich bin aber sowieso
konservativ und verwende keine Leerzeichen bzw. lasse vor wichtigen Dingen ein
Script laufen, dass Leerzeichen etc. rauswirft.

find /home/ -path '*'"$1"'*/*' -iregex '.*/[^./-]*\.[^/-]*-[^/]*\.txt$'

Wie kopiere ich dann am besten?

find ... -print0 | xargs -r -0 cp -v /ziel

geht bestimmt auch, ich benutze xargs so selten. Ich würde find kopieren
lassen (wie in meiner ersten Antwort erwähnt):

find ... -exec cp -t /ziel {} +

Ich benutze eher xargs, aber mit exec bin ich auch glücklich. Es passt jetzt.
Bin schon neugierig ob das Perl-Script schneller ist.

Mit freundlichen Grüßen
Christian, find Fan ;)

LOL. Danke!


Al
--
Um die Liste abzubestellen, schicken Sie eine Mail an:
opensuse-de+unsubscribe@xxxxxxxxxxxx
Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken
Sie eine Mail an: opensuse-de+help@xxxxxxxxxxxx

< Previous Next >