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. Die gefundenen Dateien sollen in einen Ordner kopiert werden. Kann man das mit einer Regex finden oder muss man wegen der getrennten Suche von Dateien und Ordnern dies in 2 Schritten machen? Es geht um das Durchsuchen von geschätzten 50000 Dateien. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am 09.05.2010 18:02, schrieb Al Bogner:
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.
Die gefundenen Dateien sollen in einen Ordner kopiert werden. Kann man das mit einer Regex finden oder muss man wegen der getrennten Suche von Dateien und Ordnern dies in 2 Schritten machen? Es geht um das Durchsuchen von geschätzten 50000 Dateien.
Al Einmalige Aktion oder ständiger Einsatz? Entsprechend sollte dann die Qualität des Scripts zwischen einfach und schmutzig oder ausgefuchst liegen.
Gruß -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag 09 Mai 2010 19:30:35 schrieb Ralf Prengel:
Am 09.05.2010 18:02, schrieb Al Bogner:
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.
Die gefundenen Dateien sollen in einen Ordner kopiert werden. Kann man das mit einer Regex finden oder muss man wegen der getrennten Suche von Dateien und Ordnern dies in 2 Schritten machen? Es geht um das Durchsuchen von geschätzten 50000 Dateien.
Al
Einmalige Aktion oder ständiger Einsatz? Entsprechend sollte dann die Qualität des Scripts zwischen einfach und schmutzig oder ausgefuchst liegen.
Mehrmals pro Jahr. Das Bash-Script muss nicht schön sein, sondern funktionieren. Ein paar Sekunden länger ist auch egal. Wenn es sein muss, schaffe ich es auch alleine, aber ich bin mir sicher, dass hier "geniale" Vorschläge kommen, von denen man was lernt ;-) Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag, 9. Mai 2010 18:02:14 schrieb Al Bogner: Hallo Al,
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,
Deine Aufgabenstellung / Schlussfolgerung ist nicht korrekt! Es sollte nur die erste Datei gefunden werden, da bei der zweiten kein "-" nach dem "." folgt.
wenn nach einem "Directory-Inhalt" mit bc gesucht wird, der 3. darf nicht gefunden werden, da da vor dem "-" kein Punkt ist.
und s.o. Wenn der Filter unten Deinen Anspruechen genuegt, ist der Rest kein Problem - auch nicht bei zig-1000 Files! Schiebe mal ein paar Beispiele in eine Datei "text" und lass den grep laufen: grep "\.\{1,\}[a-zäöüßA-ZÄÖÜ0-9]\{1,\}[\-]\{1,\}[a-zäöüßA-ZÄÖÜ0-9]\{1,\}.[Tt][Xx][Tt]" text Fazit: Suche nach ein oder mehr "." gefolgt von ein bis mehrfach "alphanum+ß+äöü" gefolgt von ein bis mehrfach "-" gefolgt von ein bis mehrfach "alphanum+ß+äöü" abschliessend ".txt" (upper or lower) MfG Th. Moritz -- Mein Rechner hat mehr Heizleistung, als meine Heizung Rechenleistung! -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag, 9. Mai 2010 22:34:11 schrieb Thomas Moritz: Hallo Al,
Schiebe mal ein paar Beispiele in eine Datei "text" und lass den grep laufen:
In den Beispielen geht es NUR um die Dateinamen und NICHT um den kompletten Path! Der folgende Befehl sollte noch treffender sein, als der in der vorigen Mail: grep "\.\{1,\}[a-zäöüßA-ZÄÖÜ0-9]\{1,\}-[a-zäöüßA-ZÄÖÜ0-9-]\{1,\}.[Tt][Xx][Tt]" text Fazit: Suche nach ein oder mehr "." gefolgt von ein bis mehrfach "alphanum+ß+äöü" gefolgt von "-" gefolgt von ein bis mehrfach "alphanum+ß+äöü-" abschliessend ".txt" (upper or lower) MfG Th. Moritz -- Lege die eine Hand in die Gefriertruhe und die andere auf eine heiße Herdplatte. Im Durchschnitt ist das dann ein angenehmes Gefühl." [CB's Lehrer erklaert den "Durchschnitt] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag 09 Mai 2010 22:34:11 schrieb Thomas Moritz:
Am Sonntag, 9. Mai 2010 18:02:14 schrieb Al Bogner:
Hallo Al,
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,
Deine Aufgabenstellung / Schlussfolgerung ist nicht korrekt! Es sollte nur die erste Datei gefunden werden, da bei der zweiten kein "-" nach dem "." folgt.
Sorry, du hast recht. Das 2. Beispiel hätte so lauten sollen: /dir1/dir2//abcd/dir4/03.11-nochwas.txt Deinen Vorschlag sehe ich mir ASAP an. Ich kann gerade nicht an diesen Rechner. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Es geht darum, dass Dateien in ein neues Verzeichnis kopiert werden sollen,= =20 wenn der Ordner eine bestimmte Zeichenkette enth=E4lt und der Dateiname zwi= schen=20 Anfang und dem ersten "-" einen Punkt enth=E4lt 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 ei= nem=20 "Directory-Inhalt" mit bc gesucht wird, der 3. darf nicht gefunden werden, = da=20 da vor dem "-" kein Punkt ist.
Hi Al, ich tendiere dazu, so was mit Perl statt rein mit bash zu lösen. Hier würde nur eine Liste (Ergebnis von find) abgescannt und passende Dateinamen ausgegeben while(<>) { chop; ($path, $fname) =~ m#(.*)/(.*)#; if($path =~ /bc/ && $fname =~ /\..*-.*\..txt$/) { print "$_\n"; } } Ob das nun noch mit File::find oder einer selbstgebauten Rekursion gekoppelt wird und auch die Dateien gleich selber kopiert, hängt vom Umfeld ab. Wolfgang Hamann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 10 Mai 2010, hamann.w@t-online.de schrieb:
/dir1/dir2/dir3/abcdef/dir5/1.2-irgendwas.txt /dir1/dir2//abcd/dir4/03.11nochwas.txt /dir1/dir2/dir3/abcdef/dir5/1-irgendwasanderes.txt [..] Ob das nun noch mit File::find oder einer selbstgebauten Rekursion gekoppelt wird und auch die Dateien gleich selber kopiert, hängt vom Umfeld ab.
Hier meine Perl-Version: ==== #!/usr/bin/perl -w use strict; use File::Find; sub wanted { if( index($File::Find::dir, "bc") > -1 && /\..*-.*\.txt/i ) { print "$_\n"; } } if( $#ARGV < 0 ) { push(@ARGV, "."); } find( { wanted => \&wanted, no_chdir => 0 }, @ARGV); ==== HTH, -dnh -- MISC You are the 4711th visitor of this page. -- man xawtv -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag 10 Mai 2010 15:30:43 schrieb David Haller:
Hallo,
Am Mon, 10 Mai 2010, hamann.w@t-online.de schrieb:
/dir1/dir2/dir3/abcdef/dir5/1.2-irgendwas.txt /dir1/dir2//abcd/dir4/03.11nochwas.txt /dir1/dir2/dir3/abcdef/dir5/1-irgendwasanderes.txt
[..]
Ob das nun noch mit File::find oder einer selbstgebauten Rekursion gekoppelt wird und auch die Dateien gleich selber kopiert, hängt vom Umfeld ab.
Hier meine Perl-Version:
==== #!/usr/bin/perl -w use strict; use File::Find;
sub wanted { if( index($File::Find::dir, "bc") > -1 && /\..*-.*\.txt/i ) { print "$_\n"; } }
if( $#ARGV < 0 ) { push(@ARGV, "."); } find( { wanted => \&wanted, no_chdir => 0 }, @ARGV); ====
Danke David, ich bin aber leider nicht in der Lage, das so abzuändern, dass ein Script mit Optionen entsteht, also etwa so suche.pl Suchkriterium [Suchpfad, falls nicht vom aktuellen Verzeichnis und darunter'] [Zielverzeichnis der kopierten Dateien, falls nicht Defaultverzeichnis] Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Al! 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$'
Die gefundenen Dateien sollen in einen Ordner kopiert werden. Kann man das mit einer Regex finden oder muss man wegen der getrennten Suche von Dateien und Ordnern dies in 2 Schritten machen?
-exec cp -t /target {} +
Es geht um das Durchsuchen von geschätzten 50000 Dateien.
könnte ein Weiclhen dauern. Mit freundlichen Grüßen Christian -- Wie man sein Kind nicht nennen sollte: B. Klopt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag, 10. Mai 2010 08:18:49 schrieb Christian Brabandt: Hi Christian!
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 Meine "boese" grep-Line fuer den Filenamen saehe daher folgendermassen aus: grep "\.\{1,\}[a-zäöüßA-ZÄÖÜ0-9 ]\{1,\}-[a-zäöüßA-ZÄÖÜ0-9 -]\{1,\}*\.[Tt][Xx][Tt]" Die sollte fast alles fressen inkl. Spaces. MfG Th. Moritz -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
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).
Meine "boese" grep-Line fuer den Filenamen saehe daher folgendermassen aus:
grep "\.\{1,\}[a-zäöüßA-ZÄÖÜ0-9 ]\{1,\}-[a-zäöüßA-ZÄÖÜ0-9 -]\{1,\}*\.[Tt][Xx][Tt]"
Die sollte fast alles fressen inkl. Spaces.
Ich würde eher mit Negierung arbeiten und \.\{1,\} könnte man auch zu \.\.* vereinfachen (analog könnte man das mit den anderen auch machen, dort sieht das dann aber komplizierter aus). Grüße, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
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. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Al! 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 … (Sprich, du erzwingst, dass bc innerhalb eines Verzeichnisses matchen muß, weil irgendwann danach noch ein '/' folgen muß.) Mit freundlichen Grüßen Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
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. Wie kopiere ich dann am besten? find ... -print0 | xargs -r -0 cp -v /ziel Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Al! 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: 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 {} + Mit freundlichen Grüßen Christian, find Fan ;) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
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@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag 10 Mai 2010 21:42:36 schrieb Christian Brabandt: Hallo Christian
find ... -exec cp -t /ziel {} +
Ich verwende nun das: find /daten/ -path '*'"$1"'*/*' -iregex '.*/[^./-]*\.[^/-]*-[^/]*\.txt$' \ -exec cp -v -t //tmp/forward/ {} + Zur Kontrolle würde ich gerne das "Kriterium mit dem Punkt" umkehren. Es sollen also alle Dateien gefunden werden, die _keinen_ Punkt vor dem 1. - haben. Könntest du mir bitte nochmals helfen. Übrigems zeitlich ist es gar nicht so schlimm. Ich frage via NFS ab, ca. 46000 Dateien in 14000 Ordnern. Nach etwa 20 Sekunden beginnt das Kopieren. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Al! On Di, 11 Mai 2010, Al Bogner wrote:
Am Montag 10 Mai 2010 21:42:36 schrieb Christian Brabandt:
find ... -exec cp -t /ziel {} +
Ich verwende nun das:
find /daten/ -path '*'"$1"'*/*' -iregex '.*/[^./-]*\.[^/-]*-[^/]*\.txt$' \ -exec cp -v -t //tmp/forward/ {} +
Zur Kontrolle würde ich gerne das "Kriterium mit dem Punkt" umkehren. Es sollen also alle Dateien gefunden werden, die _keinen_ Punkt vor dem 1. - haben. Könntest du mir bitte nochmals helfen.
Dann probiere halt mal: find … -iregex '.*/[^./-]*-[^/]*\.txt$'
Übrigems zeitlich ist es gar nicht so schlimm. Ich frage via NFS ab, ca. 46000 Dateien in 14000 Ordnern. Nach etwa 20 Sekunden beginnt das Kopieren.
Gut zu wissen. Grüße, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag 10 Mai 2010 10:59:50 schrieb Thomas Moritz:
grep "\.\{1,\}[a-zäöüßA-ZÄÖÜ0-9 ]\{1,\}-[a-zäöüßA-ZÄÖÜ0-9 -]\{1,\}*\.[Tt][Xx][Tt]"
Die Dateien haben an sich keine Leerzeichen und deutsche Umlaute und verwenden nur Kleinbuchstaben. Es kann aber nicht garantiert werden, dass da irgendein "seltenes" UTF-8-Zeichen vorkommt. Kürzlich habe ich nordische Zeichen in Dateinamen entdeckt. Es läuft ein Script, dass die Dateinamen von sämtlichen Sonderzeichen und Leerzeichen befreit, wenn da jemand zB unerwartet und unbeabsichtigt ein japanisches Zeichen verwendet, dann bleibt das so. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag 10 Mai 2010 08:18:49 schrieb Christian Brabandt:
Hi Al!
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$'
Die gefundenen Dateien sollen in einen Ordner kopiert werden. Kann man das mit einer Regex finden oder muss man wegen der getrennten Suche von Dateien und Ordnern dies in 2 Schritten machen?
-exec cp -t /target {} +
Es geht um das Durchsuchen von geschätzten 50000 Dateien.
könnte ein Weiclhen dauern.
Kürzlich musste ich nach bestimmten Ordnern auf 2 Rechnern suchen. Das hat mit find via NFS über 6h gedauert. Irgendwie gingen Ordner beim Kopieren auf eine neue HD verloren, keine Ahnung wie so was passieren kann. Eine Logik war nicht feststellbar. Ich denke es würde schneller gehen, wenn man die komplette Dateistruktur in ein Textfile schreibt und dann dieses File analysiert. Ich werde am Nachmittag mit den Syntax-Beispielen testen. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (6)
-
Al Bogner
-
Christian Brabandt
-
David Haller
-
hamann.w@t-online.de
-
Ralf Prengel
-
Thomas Moritz