2012-11-16 16 views
7

私の人生にとっては、これに対して適切な正規表現を見つけることができません。Linux用の正規表現ファイルのパーミッション(数字表記)

私が探しているのは、Linuxファイルのアクセス許可の有効な数値表現に一致する正規表現です(たとえば、全読みなしの場合は740、全オールの場合は777)。これまでのところ、私は次のことを試してみた:

strtotest=740 
echo "$strtotest" | grep -q "[(0|1|2|3|4|5|7){3}]" 
if [ $? -eq 0 ]; then 
    echo "found it" 
fi 

上記の問題点は、正規表現は関係なく、任意の他の文字の、その中に1-5または7で何かを一致していることです。たとえば、strtotest709に変更する場合、条件はtrueになります。私も[0|1|2|3|4|5|7{3}][(0|1|2|3|4|5|7{3})]を試しましたが、それらもうまくいきません。

私が使用している正規表現は間違っていますか、またはgrepを処理しなければならないものがありませんか?

答えて

5

あなたのために働くために起こっている最も単純で明白な正規表現は次のとおりです。ここで

grep -q '(0|1|2|3|4|5|7)(0|1|2|3|4|5|7)(0|1|2|3|4|5|7)' 

最適化されたバージョンである:6は、同様に私たちの権限を表すことができますので、

grep -Eq '(0|1|2|3|4|5|7){3}' 

それをさらに最適化することができます:

grep -Eq '[0-7]{3}' 
+0

ありがとうございます!これは完全に機能しました。私は何人かの人を担当することができればいいと思うが、私はそうするためにこのサイトでもっと活発にする必要があると思う:P –

+0

'grep -Eq" [(0 | 1 | 2 | 3 | 4 | 5 | 7)] {3} "(そしてその長いいとこ)は実際には間違っています。 '[]'は範囲を定義するので、あなたの正規表現は '|| 9'、' 77 'などと一致します。 – doubleDown

+0

これは受け入れられた答えであり、見られる可能性が最も高い正規表現であるため、正規表現が訂正されました。 – OmnipotentEntity

3
  1. あなたの正規表現は非常に壊れている:[]は、範囲を定義し、その中のすべての文字が許可されているセットです。
  2. grepには余分な引用規則があり、余分に\が必要な場合があります。
  3. grepは各行内の正規表現を検索します。行頭で一致させる場合は、正規表現の最初の文字として^が必要です。行の最後に一致させたい場合は、正規表現の末尾に$があります。
+0

ああ、私のところでは失敗します。私は括弧が正規表現に必要な何かgrepであるという誤った仮定の下にいました。 –

7

あなたが望むものはprobです巧み

grep -Eq "[0-7]{3}" 

編集: あなたが特定の権限を持つファイルを見つけるためにこれを使用している場合、あなたはむしろfind-perm)、または単に参照のためstat

+0

ありがとうございます。私は学習の練習としてこれをやっています。私は、実行され、権限が与えられたときに、その中のすべてのファイルとサブディレクトリの権限を与えられた権限に変更するBASHシェルでこれを使用しています。 –

1

で見ている必要があり、あなたがそれを行うことができますBashのシェルパターン

if [[ $strtotest == [0-7][0-7][0-7] ]]; then 
    echo "Found it" 
fi 
+0

正規表現の問題に対処し、 '$? 'の明示的な比較を取り除くために+1します。 – chepner