Wir möchten alle Protokolle erfassen, die mit ".log.[beliebige Zahl]" enden.
Also erstelle ich diese Syntax
find . -type f -regex '^.log.*[0-9]$' -print
command does not give any output
Dies erfasst die Dateien jedoch nicht wie folgt (erwartete Ergebnisse):
controller.log.2018-01-03-01
server.log.2017-10-31-03
server.log.2018-01-23-11
server.log.2018-04-06-17
server.log.2018-07-07-05
controller.log.2018-01-03-02
log-cleaner.log.10
server.log.2017-10-31-04
server.log.2018-01-23-12
server.log.2018-04-06-18
server.log.2018-07-07-06
controller.log.2018-01-03-03
log-cleaner.log.2
server.log.232.434
was ist falsch an meiner Syntax?
Antwort1
-regex(eine GNU-Erweiterung, die findheutzutage auch von einigen anderen Implementierungen erkannt wird, allerdings mit großen Unterschieden) ist ähnlich, -pathaußer dass es reguläre Ausdrücke statt Platzhalter verwendet. Es gleicht den gesamten Dateipfad ab, nicht nur den Namen.
Also .*\.log.*[0-9](keine Notwendigkeit für ^oder $, übrigens, sie sind implizit mit find's -regex) würde auf übereinstimmen, ./dir/foo.log-3aber auch ./foo.logic/file.bz2, wo das .*erfasste ic/file.bz.
-nameÜbereinstimmungen mit der DateiNameverwendet nur Platzhalter, hat aber kein reguläres Gegenstück. Für Dateien, deren Namen eine Ziffer enthalten .logund mit einer Ziffer enden, benötigen Sie hier ohnehin keine regulären Ausdrücke -name '*.foo*[0-9]'.
Sie können jedoch mit regulären Ausdrücken dasselbe tun -regex '.*\.log[^/]*[0-9]', d. h. sicherstellen, dass der Teil zwischen .logund der letzten Ziffer keine enthält, /sodass es nur mit dem Dateinamen übereinstimmt.
Mit -regexkönnen Sie bei der Angabe der Muster noch weiter gehen, insbesondere wenn Sie erweiterte reguläre Ausdrücke aktivieren und dies -Ebei einigen BSDs findoder -regextype posix-extendedbei GNU der Fall ist find.
find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD
Hier passend zu „on“, .loggefolgt von einem oder mehreren „ .<number>oder“ -<number>.
Ohne -regextype posix-extendedGNU findsind die regulären AusdrückeEmacsRegexps, eine Art Hybrid zwischen standardmäßigen grundlegenden Regexps und standardmäßigen erweiterten Regexps (unterstützt +, aber die Gruppierung erfolgt mit \(...\)statt (...)).
Ohne -EBSD findsind reguläre Ausdrücke standardmäßige Basis-reguläre Ausdrücke.
Antwort2
Versuchen,
find . -type f -regex ".*\.log\..*[0-9]$"
./server.log.2018-01-23-12
./server.log.2018-07-07-06
./log-cleaner.log.2
./log-cleaner.log.10
./server.log.232.434
./server.log.2018-01-23-11
./server.log.2017-10-31-03
./controller.log.2018-01-03-01
./server.log.2018-04-06-17
./log-cleaner.log.1
./controller.log.2018-01-03-03
./server.log.2018-04-06-18
./controller.log.2018-01-03-02
./server.log.2018-07-07-05
./server.log.2017-10-31-04
- wir müssen entkommen
.
Antwort3
Wenn nach "log" nur Ziffern, ., und kommen -, könnte das Folgende auch funktionieren
find . -type f -regex ".*[.]log[-.0-9]*$"
Antwort4
Sie können Ihre Dateien auf folgende Weise suchen, ohne auf zurückgreifen zu müssen non-GNU find:
find . -type f \
\( -name '?*.log.[0-9]' -o \
\( \
-name '?*.log.[0-9]*[0-9]' \
! -name '?*.log.?*[!0-9.-]*?' \
! -name '?*.log.?*[.-][.-]*?' \
\) \
\) \
-print;
Dabei wird eine mehrschichtige Filterung der erfassten Dateinamen durchgeführt, die Anzahl der erfassten Dateien wird schrittweise reduziert und auf das erforderliche Maß konzentriert. Genauer gesagt:
- Wählen Sie sofort eine beliebige Datei aus
basename, deren Pfad mit einem endet.log.single_digit - OTW, wählen Sie diejenigen aus, die auf enden.
.log.NUManythingNUMDadurch wird die Tendenz festgelegt, dass die Dateinamen im Netz gefangen werden. - Lehnen Sie von den oben genannten Fällen diejenigen ab, die zufällig ein
non number, non dash, or non dotimanythingDateinamenteil haben. Beachten Sie, dass die Tendenz, mit einer Ziffer zu beginnen und zu enden, beachtet werden muss. - Jetzt enthält unser Catch alle Dateien, deren
anythingTeil nur ausdigit(s),dot(s), und bestehtdash(s). Die letzte Einschränkung besteht darin, dass diedotoderdashnicht jeweils als unmittelbare Nachbarn links und rechts von ihnen haben dürfen. - PS Beachten Sie, dass diese
-nameOption nur den Basisnamenteil des Dateinamens betrachtet UND -nameDer Teil arbeitet auf dieserwildcardBasis und ist daher implizit verankert, was bedeutet, dass der übereinstimmende Name vollständig ist.


