Проверка существует ли файл 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. Проверка «битых» ссылок

Примечания

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

Читайте также:  Iso файл чем открыть windows

В современных 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 — Истина, если ФАЙЛ существует и является исполняемым.
Читайте также:  Куда установлена java linux

Вывод

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

Источник

Как мне проверить, существует ли файл или файловый каталог в bash?

В настоящее время у меня есть этот сценарий bash (который находится в моем домашнем каталоге, т.е. /home/fusion809/ , и я запускаю его как root, поскольку это необходимо для строк копирования значков):

Я хочу, чтобы этот сценарий копировал значки из моего каталога Pictures/Icons and logos в подкаталоги темы scalable (указанной в $B ) в /usr/share/icons . Однако, прежде чем он это сделает, я бы хотел, чтобы он создал каталог scalable в этих подкаталогах темы, если он еще не существует. Проблема в том, что другая часть условных выражений не читается должным образом, поскольку я продолжаю получать эту ошибку:

Если вам интересно, почему test -e . в условном выражении, он основан на учебнике по сценариям bash, за которым я следил.

2 ответа

Проверка существования файла и / или каталога

Чтобы проверить, существует ли файл в bash, вы используете оператор -f . Для каталогов используйте -d . Пример использования:

Для получения дополнительной информации просто выполните man test .

Замечание о -e , этот тестовый оператор проверяет, существует ли файл. Хотя это может показаться хорошим выбором, лучше использовать -f , который вернет false, если файл не является обычным файлом. Например, /dev/null — это файл, а не обычный файл. В этом случае нежелательно, чтобы проверка вернула истину.

Примечание о переменных

Не забудьте также заключить переменные в кавычки, если у вас есть пробел или любой другой специальный символ, содержащийся в переменной, это может иметь нежелательные побочные эффекты. Поэтому, когда вы проверяете наличие файлов и каталогов, заключите файл / каталог в двойные кавычки. Что-то вроде [ -f «/path/to/some/$

/» ] будет работать, а следующее не удастся, если в dir есть пробел: [ -f /path/to/some/$/ ] .

Исправление синтаксической ошибки

У вас есть синтаксическая ошибка в операторах управления. Предложение bash if имеет следующую структуру:

Или необязательно с предложением else :

Вы не можете опустить предложение then . Если вы хотите использовать только предложение else , вы должны отрицать это условие. Результатом является следующий код:

Здесь мы добавляем восклицательный знак ( ! ), чтобы перевернуть оценку выражения. Если выражение истинно, то же выражение, которому предшествует ! , вернет ложь и наоборот.

Вы не можете пропустить часть then оператора if , самым простым решением было бы просто отрицать тест

Я оставил его с -e (существует), но вы можете рассмотреть возможность использования -d для каталогов или -f для файлов и некоторой обработки ошибок, чтобы отловить что-то (например, / usr / share / icons / $ j / scaleable / существует, но по какой-то причине является файлом, а не каталогом.) Я также заметил, что в исходном коде вы потенциально пытаетесь скопировать несколько файлов в один:

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

Источник

Как проверить, существует ли файл или каталог в 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 — Истина, если ФАЙЛ существует и является исполняемым.

Выводы

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

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

Источник

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