「.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
ここで、 に.log一致し、その後に 1 つ以上のまたは.<number>が続きます-<number>。
-regextype posix-extendedGNUfindの正規表現がなければエマック正規表現。標準の基本正規表現と標準の拡張正規表現のハイブリッドのようなもの ( をサポートします+が、グループ化は\(...\)ではなく を使用します(...))。
-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すぐに、パスが.log.single_digit- OTW、で終わるものを選択します
.log.NUManythingNUM。これにより、ファイル名がネットに捕捉される傾向が設定されます。 non number, non dash, or non dot上記の例外のうち、ファイル名の一部にが含まれるものを拒否しますanything。数字で始まり、数字で終わるという規則は尊重する必要があることに注意してください。- これで、catch には、、
anythingのみで構成されるファイルがすべて含まれます。最後の制約は、または が、それぞれを左右両方のすぐ隣に持たないということです。digit(s)dot(s)dash(s)dotdash - PS この
-nameオプションはファイル名のベース名部分のみを参照し、 -name部分は基礎に基づいて動作するwildcardため、暗黙的にアンカーされ、一致する名前が完全であることを意味します。


