".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
ために拡張正規表現を有効にする場合は、パターンをさらに指定できます。-E
find
-regextype posix-extended
find
find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD
これは、on.log
の後に1つ以上のものが続くものと.<number>
一致します-<number>
。
-regextype posix-extended
GNUのないfind
正規表現はEmacs正規表現、標準基本正規表現と標準拡張正規表現のいくつかの混合(サポートされていますが、グループ化が代わりに+
使用されます)\(...\)
(...)
標準の基本正規表現である-E
BSD正規表現はありません。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)
dot
dash
- PSこの
-name
オプションはファイル名のデフォルト名部分のみをチェックし、 -name
セクションはこのベースで機能するため、wildcard
暗黙的に固定されます。これは、一致する名前が完全であることを意味します。