2012-11-16 17 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-57,無論任何其他字符。例如,如果將strtotest更改爲709,則條件爲真。我也嘗試過[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)' 

這裏有一個優化的版本:

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

自6可以代表的權限爲好,我們可以進一步優化:

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

你想要什麼是概率巧妙地

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

編輯: 如果你想利用這個尋找具有一定權限的文件,你倒是應該看看find-perm)或stat

+0

謝謝。我正在做這個學習練習。我在BASH shell中使用它,當它被執行並提供一個權限時,它將把所有文件和子目錄的權限更改爲給定權限。 –

1

僅供參考,你可以用它做在Bash中的殼模式

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

+1,用於解決正則表達式的問題並消除'$?'的明確比較。 – chepner