2011-10-19 3 views
1

xdayよりも古いapacheログファイルを格納場所に移動する短いスクリプトがあります。正規表現はmod_jkディレクトリのjk.shm.some_numberファイル名を取得していますが、これは望ましくない動作です(mtimeフラグを使用して数日のクッションを使用しているので、現在のアクティブファイルが誤って吸われるのを避けることはできません)私はこの問題を今までには見たことがありません)。正規表現全体は:'[error,access,error_log,access_log,mod_jk.log]*.[0-9]*'私は愚かな運のために働いていたと思います。私はまた、mod_jk部分を単独で実行するように隔離しようとしました。'mod_jk.log.[0-9]*'と期待通りに動作します(\の前に\を付けないでください)。角括弧の中に含めると、すぐにjk.shm.some_numberファイルが取得されます。大括弧内の文字の範囲に一致するので、私は推測しています。私はこれをRegexBuddyを使って動作させようとしていますが、スマートな人のうちの1人が私の間違いを指摘し、私を正しい道に導く助けになると思いました。 。bashシェルコマンドのRegexは、大規模な正規表現の一部ではなく、単独で動作します。

find -name '[error,access,error_log,access_log,mod_jk.log]*.[0-9]*' -type f 
+0

ベストは、一致する必要があるいくつかの行を指定することです。 –

+0

error.11111111111、access.11111111、error_log.1111111111、access_log.1111111、mod_jk.log.111111111。基本的には、上記で説明したと思ったApacheのログファイルのディレクトリとサブディレクトリのログファイルのファイル名です。 –

+1

私の推測では、正規表現を使用しているのではなく、globパターンです。 'mv {access、error、access_log、error_log、mod_jk.log}。[0-9] * dir'のようなものを試しているなら、これは正規表現ではなく拡張globパターンであり、中括弧でなければなりません。 – tripleee

答えて

0

あなたfindはを持っている場合オプションを使用することができます。それ以外の場合は、これを個々のグロブパターンに分割する必要があります。

find -type f -name 'error.[0-9]*' -o -name 'access.[0-9]*' -o -name 'error_log.[0-9]*' -o -name 'access_log.[0-9]*' -o -name 'mod_jk.log.[0-9]*' 

グロブパターンで、*はちょうどDOS形式のワイルドカードではなく、正規表現の繰り返し演算子であることに注意してください。 find -regexをお持ちの場合は、マッチングをより詳細に制御できます。両方の正規表現で

find -type f -regex '.*\(\(error\|access\)\(_log\)?\|mod_jk\.log\)\.[0-9]+' 

のみ括弧の中に列挙セットのうちの一つの文字に一致[ab|cd]をグロブ。パイプ文字はこの文脈でそれ自体を表すだけです。

+0

助けてくれてありがとう。 –

0

*の試合ゼロ以上の文字ので、本当にこの正規表現は任意の* *ファイル名と一致します、:

これは-mtimeフラグ付きの作品は、「削除されたことを現在の行です。 *+に変更して、前の式と少なくとも1つの一致を強制したいと思われます。

+0

この場合、[elements] *は大括弧内の要素のどれかと一致し、ワイルドカードとして動作しないと考えました。 [0-9] *は、ファイル拡張子 '。'の後の任意の数字と一致する必要があります。 +を使用すると、何も一致しません。 –

0

私はあなたが

(error|access|error_log|access_log|mod_jk.log).[0-9]+ 

あなたの正規表現は、ドットの後にあなたの最初の角括弧内の文字のみを含むすべての名前と「」、そしておそらくいくつかの数字に一致するメンターだと思います。ドットだけで大丈夫だったでしょう。

代替手段を使用する場合は、パイプをデリミタとして使用する丸いブラケットを使用してください。ドットの後に(少なくとも)何桁の数字があるか知っていますか?

+0

私にとってはうまくいきます: 'TEST = access_log.1111111; EXPR = "(エラー|アクセス|エラーログ|アクセスログ| mod_jk.log)[0-9] +"; [$ TEST =〜$ EXPR]; echo $? ' - 正規表現をどのように実行しますか?私はこの表現が "拡張"表記法を使用していると思う、grepは私が間違っていない場合、追加のフラグを必要とするだろう。 –

+0

私はそれをfindの一部として使用しています:find -name 'regex_here' -type f -mtime ...各拡張の正確な長さはわかりませんが、[0-9] *は動作しているようです今のところ検索のその部分に行く限り。 –

0

あなたのパターン:

'[error,access,error_log,access_log,mod_jk.log]*.[0-9]*' 

は、あなたがそれだと思う何をしていません。正規表現でさえ、欠陥がありますが、bashはグロブを使用します。 []は種類の1つの文字に一致しますが、試しているような完全な単語ではありません。 *は任意の文字の出現回数と一致しますが、0〜9の範囲の文字は一致しません。

まずがでグロブ拡張を有効にします。

shopt -s extglob 

は、使用:

+(pattern1|pattern2|..) for alternate patterns. 

+([0-9]|[0-9][0-9]|..) 

HTHクリス

+0

答えをくれてありがとう、私は正しい道を歩み始めました。問題は、findを使用していて、-regexオプションを使用していないことでした。私は助けに感謝します。 –

関連する問題