7.2. Операции проверки файлов | Популярный Linux

Опубликовано Bash в Ср, 23/12/2009 — 20:56


Возвращает true если…

-e

файл существует

-f

обычный файл (не каталог и не файл устройства)

-s

ненулевой размер файла

-d

файл является каталогом

-b

файл является блочным устройством (floppy, cdrom и т.п.)

-c

файл является символьным устройством (клавиатура, модем, звуковая карта и т.п.)

-p

файл является каналом

-h

файл является символической ссылкой

-L

файл является символической ссылкой

-S

файл является сокетом

-t

файл (дескриптор) связан с терминальным устройством

Этот ключ может использоваться для проверки — является ли файл стандартным устройством ввода stdin ([ -t 0 ]) или стандартным устройством вывода stdout ([ -t 1 ]).

-r

файл доступен для чтения (пользователю, запустившему сценарий)

-w

файл доступен для записи (пользователю, запустившему сценарий)

-x

файл доступен для исполнения (пользователю, запустившему сценарий)

-g

set-group-id (sgid) флаг для файла или каталога установлен

Если для каталога установлен флаг sgid, то файлы, создаваемые в таком каталоге, наследуют идентификатор группы каталога, который может не совпадать с идентификатором группы, к которой принадлежит пользователь, создавший файл. Это может быть полезно для каталогов, в которых хранятся файлы, общедоступные для группы пользователей.

-u

set-user-id (suid) флаг для файла установлен

Установленный флаг suid приводит к изменению привилегий запущенного процесса на привилегии владельца исполняемого файла. Исполняемые файлы, владельцем которых является root, с установленным флагом set-user-id запускаются с привилегиями root, даже если их запускает обычный пользователь. [16] Это может оказаться полезным для некоторых программ (таких как pppd и cdrecord), которые осуществляют доступ к аппаратной части компьютера. В случае отсутствия флага suid, программы не смогут быть запущены рядовым пользователем, не обладающим привилегиями root.

  1.         -rwsr-xr-t    1 root       178236 Oct  2  2000 /usr/sbin/pppd
  2.        

Файл с установленным флагом
suid
отображается с включенным флагом
s в поле прав доступа.

-k

флаг sticky bit (бит фиксации) установлен

Общеизвестно, что флаг «sticky bit» — это специальный тип прав доступа к файлам. Программы с установленным флагом «sticky bit» остаются в системном кэше после своего завершения, обеспечивая тем самым более быстрый запуск программы. [17] Если флаг установлен для каталога, то это приводит к ограничению прав на запись. Установленный флаг «sticky bit» отображается в виде символа t в поле прав доступа.

  1.         drwxrwxrwt    7 root         1024 May 19 21:26 tmp/
  2.        

Если пользователь не является владельцем каталога, с
установленным «sticky bit», но имеет право на запись в
каталог, то он может удалять только те файлы в каталоге, владельцем
которых он является. Это предотвращает удаление и перезапись
«чужих» файлов в общедоступных каталогах, таких как
/tmp.

-O

вы являетесь владельцем файла

-G

вы принадлежите к той же группе, что и файл

-N

файл был модифицирован с момента последнего чтения

f1 -nt f2

файл f1 более новый, чем f2

f1 -ot f2

файл f1 более старый, чем f2

f1 -ef f2

файлы f1 и f2 являются «жесткими» ссылками на один и тот же файл

!

«НЕ» — логическое отрицание (инверсия) результатов всех вышеприведенных проверок (возвращается true если условие отсутствует).

Пример 7-4. Проверка «битых» ссылок

  1. #!/bin/bash
  2. # broken-link.sh
  3. # Автор Lee Bigelow <ligelowbee@yahoo.com>
  4. # Используется с его разрешения.
  5. #Сценарий поиска «битых» ссылок и их вывод в «окавыченном» виде
  6. #таким образом они могут передаваться утилите xargs для дальнейшей обработки 🙂
  7. #например. broken-link.sh /somedir /someotherdir|xargs rm
  8. #
  9. #На всякий случай приведу лучший метод:
  10. #
  11. #find «somedir» -type l -print0|\
  12. #xargs -r0 file|\
  13. #grep «broken symbolic»|
  14. #sed -e ‘s/^\|: *broken symbolic.*$/»/g’
  15. #
  16. #но это не чисто BASH-евский метод, а теперь сам сценарий.
  17. #Внимание! будьте осторожны с файловой системой /proc и циклическими ссылками!
  18. ##############################################################
  19. #Если скрипт не получает входных аргументов,
  20. #то каталогом поиска является текущая директория
  21. #В противном случае, каталог поиска задается из командной строки
  22. ####################
  23. [ $# -eq 0 ] && directorys=`pwd` || directorys=$@
  24. #Функция linkchk проверяет каталог поиска
  25. #на наличие в нем ссылок на несуществующие файлы, и выводит их имена.
  26. #Если анализируемый файл является каталогом,
  27. #то он передается функции linkcheck рекурсивно.
  28. ##########
  29. linkchk () {
  30.     for element in $1/*; do
  31.     [ -h «$element« -a ! -e «$element« ] && echo $element
  32.     [ -d «$element« ] && linkchk $element
  33.     # Само собой, ‘-h’ проверяет символические ссылки, ‘-d’ — каталоги.
  34.     done
  35. }
  36. #Вызов функции linkchk для каждого аргумента командной строки,
  37. #если он является каталогом.  Иначе выводится сообщение об ошибке
  38. #и информация о порядке пользования скриптом.
  39. ################
  40. for directory in $directorys; do
  41.     if [ -d $directory ]
  42.         then linkchk $directory
  43.         else
  44.             echo «$directory не является каталогом»
  45.             echo «Порядок использования: $0 dir1 dir2 …»
  46.     fi
  47. done
  48. exit 0

Пример 28-1, Пример 10-7, Пример 10-3, Пример 28-3 и Пример A-2 так же иллюстрируют операции проверки файлов.


[16]    С флагом suid, на двоичных исполняемых файлах, надо быть очень осторожным, поскольку это может быть небезопасным. Установка флага suid на файлы-сценарии не имеет никакого эффекта.

[17]    В современных Unix-системах, «sticky bit» больше не используется для файлов, только для каталогов.

Запись опубликована в рубрике Без рубрики. Добавьте в закладки постоянную ссылку.