foo.log
とそのログの巡回兄弟foo.1.gz
とfoo.2.gz
を最新のものから古いものへと繰り返したいと思っています。 foo.bar
POSIX glob - 1つ以上の[〜:digit:]の一致方法
幸いにも、logrotate
は、最新のものからアルファベットのものまでが同じ順序です。
私の元の試みはfor f in $(ls -t foo.*); do ...
でしたが、shellcheck
はIterating over ls output is fragile. Use globs. [SC2045]
となりました。プラスこのコードは、望ましくないfoo.bar
と一致します。
しかしどのように任意の桁数をグロブパターンに一致させますか?(これはサポートされていませんか?)私は各桁数を明示的にリストする方法しか知りません。私は、例えば、以下のハンドル1と2桁の数字と正しくfoo.1bar.gz
を除外しますがfoo.123.gz
を処理していない(と私はglob
INGは場所を取るさせるための正しいことをやっていないよ!)
for f in foo.log foo.[[:digit:]].gz foo.[[:digit:]][[:digit:]].gz; do ...
100人以上の兄弟がログを返すことはないと思うかもしれませんが、私は好きではありません。 POSIX準拠したソリューションをお探し
...
編集:logrotateのconfには、いくつかのファイルのために圧縮して、他人のために圧縮されません。だから、すべての兄弟が.gz
で終わるわけではありません。
ああ、 'foo。*。gz'は' foo.bar.log.1.gz'にマッチします。最初のログは 'foo.bar.log'の' foo.bar.log'とは無関係で、私は '[[:digit:]]'を使っているのですから... – user1011471
私は自分の答えを編集しました。改訂されたパターンは役に立ちますか? –
それはもっと近いです。しかし(1)時々回転した兄弟は圧縮されていないので、 '.gz'で終わらないことがあります。私はそれをその問題の可能性として述べるべきです。 'foo。[0-9] *'は 'foo.0a'にマッチするように開きます。これは私のコードのバグです。また、(2)オリジナルは 'foo.0a.gz'にマッチします。これは、ログディレクトリのファイル名は間違いありません。'[[:digit:]] 'を使ってリストを表示することは、私の場合はそれを扱うかもしれませんが、n桁ではなく、1桁と2桁の数字を扱っています。 (ログの回転はさておき、globで1〜n桁の数字を処理する方法があるのかどうか疑問に思います。) – user1011471