Grep-строки для чисел, больших заданного числа

19

Я пытаюсь использовать grep для строк в первом поле вывода, которое больше заданного числа. В этом случае это число 755 . В конечном итоге то, что я делаю, пытается перечислить каждый файл с привилегиями, превышающими (а не равными) 755 , используя stat -c '%a %n' * , а затем подключиться к некоторому grep'ing (или, возможно, sed'ing?), Чтобы получить это окончательный список. Любые идеи о том, как это лучше всего сделать?

    
задан user2150250 01.05.2013 в 00:24
источник
  • Поскольку 755 действительно является восьмеричным числом, представляющим последовательность бит, что именно означает «больше»? 666 дает каждому доступ на запись; что «больше, чем« 755? 755 "больше, чем" 666? –  Keith Thompson 01.05.2013 в 02:04
  • Пользователи OS X: эквивалент stat -c '% a% n' * (Linux) выглядит как stat -f '% Lp% N' * –  mklement0 01.05.2013 в 05:11
  • человек просит grep, а люди все еще дают awk? –  Soncire 23.01.2014 в 05:27

3 ответа

21

попробуйте следующее:

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

, если вы просто хотите указать имя файла в своем конечном выпуске, пропустите номера привилегий, вы можете:

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

ИЗМЕНИТЬ

на самом деле вы могли бы сделать chmod внутри awk. но вы должны убедиться, что пользователь выполнил строку awk, имеет разрешение на изменение этих файлов.

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

, предположим, что имя файла не имеет пробелов.

    
ответ дан Kent 01.05.2013 в 00:32
  • О, спасибо за это небольшое дополнение. Я просто собирался вырезать поле 2, но ваш выполнил его за одну трубку! –  user2150250 01.05.2013 в 00:35
  • Следите за именами файлов с пробелами. –  Carl Norum 01.05.2013 в 00:37
  • @ user2150250 Заметьте, мой второй однострочный awk предполагает, что ваше имя файла не имеет места. –  Kent 01.05.2013 в 00:38
  • Просто добавьте | xargs chmod 755 в эту командную строку. –  Carl Norum 01.05.2013 в 01:01
  • @ user2150250 вы действительно можете сделать chmod в awk, см. EDIT в ansewr. –  Kent 01.05.2013 в 01:46
Показать остальные комментарии
5

Я бы использовал awk(1) :

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

Образец awk соответствует строкам, в которых первое поле больше 755. Вы можете добавить действие, если хотите напечатать подмножество строки или что-то другое (см. ответ @ Kent).

    
ответ дан Carl Norum 01.05.2013 в 00:32
3

Ни один grep и sed не являются хорошими для арифметики. awk может помочь (к сожалению, я этого не знаю). Но обратите внимание, что find тоже может быть полезной:

   -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).

Итак, что может сработать для вас:

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

Просто удалите -printf , если вам нужны только имена файлов.

    
ответ дан Lev Levitsky 01.05.2013 в 00:38