Linux как проверить есть ли файл

7.2. Операции проверки файлов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Smartfix windows 10 что это

Примечания

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

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

Источник

Как проверить, существует ли файл или каталог в Bash

How to Check if a File or Directory Exists in Bash

В Bash вы можете использовать тестовую команду, чтобы проверить, существует ли файл и определить тип файла.

Во многих случаях при написании сценариев Shell вы можете оказаться в ситуации, когда вам нужно выполнить действие, основанное на том, существует файл или нет.

Команда test принимает одну из следующих синтаксических форм:

Если вы хотите, чтобы ваш скрипт был переносимым, вам следует использовать старую [ команду test , которая доступна во всех оболочках POSIX. Новая обновленная версия команды test [[ (двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.

Проверьте, существует ли файл

При проверке существования файла чаще всего используются операторы FILE -e и -f . Первый проверит, существует ли файл независимо от его типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (не каталогом или устройством).

Наиболее читаемым вариантом при проверке существования файла является использование test команды в сочетании с if оператором . Любой из фрагментов ниже проверит, /etc/resolv.conf существует ли файл:

Вы также можете использовать команду test без оператора if. Команда после && оператора будет выполнена только в том случае, если статус выхода тестовой команды равен true,

Напротив && , оператор после || оператора будет выполняться только в том случае, если статус выхода команды test равен false .

Проверьте, существует ли каталог

Операторы -d позволяют проверить, является ли файл каталогом или нет.

Например, чтобы проверить, /etc/docker существует ли каталог, вы должны использовать:

Вы также можете использовать двойные скобки [[ вместо одной [ .

Проверьте, не существует ли файл

Как и во многих других языках, тестовое выражение можно отменить, используя ! логический оператор not (восклицательный знак):

То же, что и выше:

Проверьте, существует ли несколько файлов

Вместо использования сложных вложенных конструкций if / else вы можете использовать -a (или && с [[ ), чтобы проверить, существует ли несколько файлов:

Операторы проверки файлов

Команда test включает в себя следующие операторы FILE, которые позволяют вам тестировать определенные типы файлов:

  • -b FILE — Истина, если ФАЙЛ существует и является специальным файлом блока.
  • -c FILE — Истина, если ФАЙЛ существует и является файлом специальных символов.
  • -d FILE — Истина, если ФАЙЛ существует и является каталогом.
  • -e FILE — Истина, если ФАЙЛ существует и является файлом, независимо от его типа (узел, каталог, сокет и т. Д.).
  • -f FILE — Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
  • -G FILE — Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
  • -h FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
  • -g FILE — Истина, если ФАЙЛ существует и установлен sgid флаг set -group-id ( ).
  • -k FILE — Истина, если ФАЙЛ существует и установлен флаг закрепления битов.
  • -L FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
  • -O FILE — Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
  • -p FILE — Истина, если ФАЙЛ существует и является каналом.
  • -r FILE — Истина, если ФАЙЛ существует и доступен для чтения.
  • -S FILE — Истина, если ФАЙЛ существует и является сокетом.
  • -s FILE — Истина, если ФАЙЛ существует и имеет ненулевой размер.
  • -u FILE — Истина, если ФАЙЛ существует и установлен suid флаг set-user-id ( ).
  • -w FILE — Истина, если ФАЙЛ существует и доступен для записи.
  • -x FILE — Истина, если ФАЙЛ существует и является исполняемым.
Читайте также:  Windows product key update tools

Вывод

В этом руководстве мы показали, как проверить, существует ли файл или каталог в Bash.

Источник

Как проверить, существует ли файл или каталог в Bash

Часто при написании сценариев оболочки вы можете оказаться в ситуации, когда вам нужно выполнить действие в зависимости от того, существует файл или нет.

В Bash вы можете использовать команду test, чтобы проверить, существует ли файл, и определить тип файла.

Команда test принимает одну из следующих синтаксических форм:

Если вы хотите, чтобы ваш сценарий был переносимым, вам следует предпочесть старую команду test [ , которая доступна во всех оболочках POSIX. Новая обновленная версия тестовой команды [[ (двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.

Проверьте, существует ли файл

При проверке существования файла наиболее часто используются операторы FILE -e и -f . Первый проверит, существует ли файл независимо от типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (а не каталогом или устройством).

Наиболее удобочитаемый вариант при проверке существования файла — использование команды test в сочетании с оператором if . Любой из приведенных ниже фрагментов проверит, существует ли файл /etc/resolv.conf :

Если вы хотите выполнить другое действие в зависимости от того, существует файл или нет, просто используйте конструкцию if / then:

Вы также можете использовать команду test без оператора if. Команда после оператора && будет выполнена только в том случае, если статус выхода тестовой команды — истина,

Если вы хотите запустить серию команд после оператора && просто заключите команды в фигурные скобки, разделенные ; или && :

Напротив && , оператор после || Оператор будет выполняться только в том случае, если статус выхода тестовой команды false .

Проверить, существует ли каталог

Операторы -d позволяют вам проверить, является ли файл каталогом или нет.

Например, чтобы проверить, существует ли каталог /etc/docker вы должны использовать:

Вы также можете использовать двойные скобки [[ вместо одинарной [ .

Проверьте, не существует ли файла

Как и во многих других языках, тестовое выражение может быть отменено с помощью ! (восклицательный знак) оператор логического НЕ:

То же, что и выше:

Проверьте, существует ли несколько файлов

Вместо использования сложных вложенных конструкций if / else вы можете использовать -a (или && с [[ ), чтобы проверить, существует ли несколько файлов:

Эквивалентные варианты без использования оператора IF:

Операторы проверки файлов

Команда test включает в себя следующие операторы FILE, которые позволяют проверять файлы определенных типов:

  • -b FILE — Истина, если ФАЙЛ существует и является специальным блочным файлом.
  • -c FILE — Истина, если ФАЙЛ существует и является файлом специальных символов.
  • -d FILE — Истина, если ФАЙЛ существует и является каталогом.
  • -e FILE — Истина, если ФАЙЛ существует и является файлом, независимо от типа (узел, каталог, сокет и т. д.).
  • -f FILE — Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
  • -G FILE — Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
  • -h FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
  • -g FILE — Истина, если ФАЙЛ существует и для него установлен флаг set-group-id ( sgid ).
  • -k FILE — Истина, если ФАЙЛ существует и для него установлен флаг липкого бита.
  • -L FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
  • -O FILE — Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
  • -p FILE — Истина, если ФАЙЛ существует и является каналом.
  • -r FILE — Истинно, если ФАЙЛ существует и доступен для чтения.
  • -S FILE — Истина, если ФАЙЛ существует и является сокетом.
  • -s FILE — Истина, если ФАЙЛ существует и имеет ненулевой размер.
  • -u FILE — Истинно, если ФАЙЛ существует и установлен флаг set-user-id ( suid ).
  • -w FILE — Истина, если ФАЙЛ существует и доступен для записи.
  • -x FILE — Истина, если ФАЙЛ существует и является исполняемым.
Читайте также:  Где находятся файлы steam mac os

Выводы

В этом руководстве мы показали вам, как проверить, существует ли файл или каталог в Bash.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Проверить существование файла

Добрый, нужна помощь Нужно одной строкой на bash проверить существование файла/директории, если существует — вывести путь, если не существует — ничего не выводить сейчас делаю так

test -r /boot/loader.conf && echo /boot/loader.conf

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

f=/boot/loader.conf ; test -r $f && echo $f

Если это директория, то получится фигня.
Правильнее тогда уж ls -d /boot/loader.conf

Не подходит ни один из способов

backup# ls -d /boot/loader.conf

backup# ls -d /boot/loader.conf1

ls: /boot/loader.conf1: No such file or directory

backup# ls /boot/loader.conf 2>/dev/null

ls: 2: No such file or directory

backup# f=/boot/loader.conf ; test -r $f && echo $f

f=/boot/loader.conf: Command not found.

f: Undefined variable.

должна быть именно команда, а не часть скрипта, т.к. передается как команда на удаленную машину

backup# f=/boot/loader.conf ; test -r $f && echo $f
f=/boot/loader.conf: Command not found.
f: Undefined variable.

Фряха, небось? Тогда при чём тут bash?

У меня работает.

клиенты — те на которых будет выполняться команда разные freebsd 8-9, debian, cenots, потому нужно универсальное решение

У него фряха, а там csh.

Ты лучше скажи, для чего это нужно в итоге?

да, на debain — то что нужно, на freebsd

backup# ls /home/ivan/Downloads > /dev/null 2>&1 Ambiguous output redirect.

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

Указываю пути — если в OS нет этого пути (к примеру /boot/loader.conf в debian) то задание заканчивается с ошибкой.

Есть возможность передавать на резервируемые клиенты не точный путь — а команду, которая вернет путь файла/директории для сохранения.

Потому и хочу все пути прописать как функции — если есть — отображаем путь, будет сохранятся. Если файла нет — ничего не возвращаем, попытки скопировать файл не будет.

Мой тебе совет: лучше сделай различные правила для фри и для линуксов.

Источник

Оцените статью