Erfassen Sie Protokolldateien, die mit einer beliebigen Zahl enden

Erfassen Sie Protokolldateien, die mit einer beliebigen Zahl enden

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. NUM anything NUMDadurch 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 dotim anythingDateinamenteil 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 aus digit(s), dot(s), und besteht dash(s). Die letzte Einschränkung besteht darin, dass die dotoder dashnicht 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 dieser wildcardBasis und ist daher implizit verankert, was bedeutet, dass der übereinstimmende Name vollständig ist.

verwandte Informationen