2013-04-30 30 views
18

Ich versuche, für Linien im ersten Feld einer Ausgabe grep, die größer als eine gegebene Zahl sind. In diesem Fall ist diese Nummer 755. Letztendlich versuche ich, jede Datei mit Privilegien größer als (und nicht gleich) 755 aufzulisten, indem ich stat -c '%a %n' * benutze und dann zu etwas grep'ing (oder möglicherweise sed'ing?) Pipe, um diese abschließende Liste zu erhalten. Irgendwelche Ideen, wie dies am besten erreicht werden könnte?Grep Zeilen für Zahlen größer als die angegebene Nummer

+2

Da '755' eigentlich eine Oktalzahl ist, die eine Bitfolge darstellt, was genau bedeutet" größer als "? '666' gibt jedem Schreibzugriff; ist das "größer als" "755"? Ist "755" größer als "666"? –

+0

OS X Benutzer: Das Äquivalent von 'stat -c '% a% n' *' (Linux) scheint 'stat -f '% Lp% N' * ' – mklement0

+0

die Person fragt nach Grep, während die Leute noch geben awk? – Soncire

Antwort

20

versuchen Sie dies:

stat -c '%a %n' *|awk '$1>755' 

, wenn Sie nur den Dateinamen in die endgültige Ausgabe möchten, die Berechtigungsnummern überspringen, könnten Sie:

stat -c '%a %n' *|awk '$1>755{print $2}' 

EDIT

tatsächlich konnte man Mach das chmod innerhalb awk. aber Sie sollten sicherstellen, dass der Benutzer die awk-Zeile ausführen, die Berechtigung zum Ändern dieser Dateien hat.

stat -c '%a %n' *|awk '$1>755{system("chmod 755 "$2)}' 

wieder angenommen, der Dateiname hat keine Leerzeichen.

+0

Oh danke für dieses kleine Add-on. Ich wollte nur Feld 2 ausschneiden, aber das wird in einem Rohr erledigt! – user2150250

+0

Achten Sie auf Dateinamen mit Leerzeichen. –

+1

@ user2150250 Hinweis, mein 2. awk-Einstrich geht davon aus, dass Ihr Dateiname keinen Platz hat. – Kent

5

würde ich awk(1):

stat -c '%a %n' * | awk '$1 > 755' 

Die awk Musterlinien übereinstimmt, wo das erste Feld größer als 755. ist Sie eine Aktion hinzufügen könnte, wenn Sie unterschiedliche eine Teilmenge von einer Linie oder etwas ausdrucken möchten, zu (Siehe @ Kent's Antwort).

3

Weder grep noch sed sind gut in Arithmetik. awk könnte helfen (leider weiß ich es nicht). Aber beachten Sie, dass find hier kann sehr nützlich sein, auch:

-perm mode 
      File's permission bits are exactly mode (octal or symbolic). 
      Since an exact match is required, if you want to use this form 
      for symbolic modes, you may have to specify a rather complex 
      mode string. For example -perm g=w will only match files which 
      have mode 0020 (that is, ones for which group write permission 
      is the only permission set). It is more likely that you will 
      want to use the `/' or `-' forms, for example -perm -g=w, which 
      matches any file with group write permission. See the EXAMPLES 
      section for some illustrative examples. 

    -perm -mode 
      All of the permission bits mode are set for the file. Symbolic 
      modes are accepted in this form, and this is usually the way in 
      which would want to use them. You must specify `u', `g' or `o' 
      if you use a symbolic mode. See the EXAMPLES section for some 
      illustrative examples. 

    -perm /mode 
      Any of the permission bits mode are set for the file. Symbolic 
      modes are accepted in this form. You must specify `u', `g' or 
      `o' if you use a symbolic mode. See the EXAMPLES section for 
      some illustrative examples. If no permission bits in mode are 
      set, this test matches any file (the idea here is to be consis‐ 
      tent with the behaviour of -perm -000). 

Also, was für Sie funktionieren könnte ist:

find . -perm -755 -printf '%m %p\n' 

einfach den -printf Teil entfernen, wenn Sie nur Dateinamen benötigen.

Verwandte Themen