任意の数字で終わるログファイルのキャプチャ

任意の数字で終わるログファイルのキャプチャ

".log.[すべての数字]で終わるすべてのログをキャプチャしようとしています。

だから私はこの構文を作りました。

find .  -type f  -regex '^.log.*[0-9]$' -print

command does not give any output 

ただし、以下のファイルはキャプチャされません。 (予想結果)

  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

私の文法に問題があるのでしょうか?

答え1

-regex(GNU拡張は他のfindいくつかの実装でも認識されていますが、かなりの違いがあります。)-pathワイルドカードの代わりに正規表現を使用することを除いて、同様です。名前だけでなく、完全なファイルパスと一致します。

したがって、.*\.log.*[0-9](必須^ではありませんが$暗黙的にfind)一致しますが、キャプチャされた項目も-regex一致します。./dir/foo.log-3./foo.logic/file.bz2.*ic/file.bz

-name一致ファイル名前ワイルドカードのみが使用されますが、対応する正規表現はありません。ここでは名前に数字が含まれています。.logで終わるファイルには正規表現は必要ありません。-name '*.foo*[0-9]'

正規表現を使用して同じことを実行できます。つまり、最後の数字の間の部分に何も含まれないようにして、ファイル名とのみ一致することを-regex '.*\.log[^/]*[0-9]'確認します。.log/

特に、一部のBSDまたはGNUで使用する-regexために拡張正規表現を有効にする場合は、パターンをさらに指定できます。-Efind-regextype posix-extendedfind

find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD

これは、on.logの後に1つ以上のものが続くものと.<number>一致します-<number>

-regextype posix-extendedGNUのないfind正規表現はEmacs正規表現、標準基本正規表現と標準拡張正規表現のいくつかの混合(サポートされていますが、グループ化が代わりに+使用されます)\(...\)(...)

標準の基本正規表現である-EBSD正規表現はありません。find

答え2

努力する、

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
  • 私たちは逃げなければなりません。.

答え3

「log」の後に数字だけが続く場合でも、次のことができます.-

find .  -type f   -regex  ".*[.]log[-.0-9]*$" 

答え4

以下を使用せずにファイルを検索できますnon-GNU find

find . -type f \
    \( -name '?*.log.[0-9]' -o \
       \( \
           -name '?*.log.[0-9]*[0-9]'  \
         ! -name '?*.log.?*[!0-9.-]*?' \
         ! -name '?*.log.?*[.-][.-]*?' \
       \) \
    \) \
    -print;

この機能は、キャプチャするファイル名に対して複数層のフィルタリングを実行して、キャプチャ範囲を徐々に絞り込み、目的のファイル名に焦点を当てます。正確に言えば:

  • basenameパスが次に終わるファイルをすぐに選択します。つまり、w/o.log.single_digit
  • OTW、「this」で終わるファイル名を選択すると、.log. NUM anything NUMネットワークからファイル名を取得する傾向が設定されます。
  • 上記のキャプチャでは、non number, non dash, or non dotファイル名部分に含まれるファイルが拒否されます。anything数字で始まり終わる傾向に従う必要があります。
  • キャプチャにはこれらのファイルがすべて含まれ、一部には、およびanythingのみが含まれています。最後の制約は、それぞれを左右の直接隣接として持つことも、持つこともできません。digit(s)dot(s)dash(s)dotdash
  • PSこの-nameオプションはファイル名のデフォルト名部分のみをチェックし、
  • -nameセクションはこのベースで機能するため、wildcard暗黙的に固定されます。これは、一致する名前が完全であることを意味します。

関連情報