2012-11-16 16 views
7

Non riesco, per la vita di me, a determinare la regex corretta per questo.Regex per i permessi dei file Linux (notazione numerica)

Quello che sto cercando è un'espressione regolare per abbinare una rappresentazione numerica valida delle autorizzazioni di file Linux (ad esempio 740 per tutti i read-none, 777 per tutto-tutto-tutto). Finora ho provato la seguente:

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

Il problema di quanto sopra è che l'espressione regolare corrisponde a qualsiasi cosa con 1-5 o 7 in esso, indipendentemente da eventuali altri personaggi. Ad esempio, se strtotest dovesse essere modificato in 709, il condizionale sarebbe vero. Ho anche provato [0|1|2|3|4|5|7{3}] e [(0|1|2|3|4|5|7{3})] ma quelli non funzionano altrettanto bene.

È la regex che sto usando male, o mi manca qualcosa che ha a che fare con grep?

risposta

5

Anche l'espressione regolare più semplice e più ovvia, che sta andando a lavorare per voi è:

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

Ecco una versione ottimizzata:

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

dal 6 può rappresentare permessi pure, abbiamo potrebbe ottimizzare ulteriormente:

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

Grazie! Questo ha funzionato perfettamente. Vorrei poter + ripare alcune persone, ma suppongo di dover essere un po 'più attivo su questo sito per farlo: P –

+0

'grep -Eq" [(0 | 1 | 2 | 3 | 4 | 5 | 7)] {3} "' (e il suo cugino più lungo) che hai postato nella tua risposta è in realtà errato. '[]' definisce un intervallo, quindi la tua regex dovrebbe corrispondere a '|| 9',' 77) 'tra gli altri. – doubleDown

+0

Correggere le espressioni regolari, poiché questa è la risposta accettata e quella che è più probabile che venga vista. – OmnipotentEntity

3
  1. tuo regex è molto rotto: [] definiscono una serie, e tutti i personaggi in esso sono nel set che è consentito.
  2. grep ha alcune regole di quotazione aggiuntive che potrebbero richiedere un ulteriore \.
  3. grep cerca la tua espressione regolare all'interno di ogni riga - se vuoi che coincidano solo all'inizio della riga hai bisogno di ^ come il primo carattere nella regex, e se vuoi corrispondere alla fine della riga hai bisogno di $ alla fine della regex.
+0

Oh, non riesco da parte mia. Ero sotto la falsa ipotesi che le parentesi fossero qualcosa di grep necessario per reisex. –

7

quello che vuoi è prob abilmente

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

edit: se si sta utilizzando questo per la ricerca di file con determinate autorizzazioni, si dovrebbe piuttosto dare un'occhiata a find (-perm) o stat

+0

Grazie. Lo sto facendo come esercizio di apprendimento. Lo sto usando in una shell BASH che, quando viene eseguita e alimentata con un permesso, cambierà le autorizzazioni per tutti i file e le sottodirectory al suo interno con la specifica autorizzazione. –

1

Solo per riferimento, è possibile farlo con shell pattern in Bash

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

+1 sia per risolvere il problema con l'espressione regolare che per eliminare il confronto esplicito di '$?'. – chepner

Problemi correlati