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

Bash проверяет существование файла

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

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

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

 test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]

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

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

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

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

 FILE = /etc/resolv.conf if test -f " $FILE " ; then echo " $FILE exists." fi
 FILE = /etc/resolv.conf if [ -f " $FILE " ] ; then echo " $FILE exists." fi
 FILE = /etc/resolv.conf if [[ -f " $FILE " ]] ; then echo " $FILE exists." fi

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

 FILE = /etc/resolv.conf if [ -f " $FILE " ] ; then echo " $FILE exists." else echo " $FILE does not exist." fi

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

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

 test -f /etc/resolv.conf && echo " $FILE exists."
 [ -f /etc/resolv.conf ] && echo " $FILE exists."
 [[ -f /etc/resolv.conf ]] && echo " $FILE exists."

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

 [ -f /etc/resolv.conf ] && { echo " $FILE exist." ; cp " $FILE " /tmp/ ; }

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

 [ -f /etc/resolv.conf ] && echo " $FILE exist." || echo " $FILE does not exist."

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

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

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

 FILE = /etc/docker if [ -d " $FILE " ] ; then echo " $FILE is a directory." fi
 [ -d /etc/docker ] && echo " $FILE is a directory."

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

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

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

 FILE = /etc/docker if [ ! -f " $FILE " ] ; then echo " $FILE does not exist." fi

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

 [ ! -f /etc/docker ] && echo " $FILE does not exist."

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

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

 if [ -f /etc/resolv.conf -a -f /etc/hosts ] ; then echo "Both files exist." fi
 if [[ -f /etc/resolv.conf && -f /etc/hosts ]] ; then echo "Both files exist." fi

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

 [ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
 [[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."

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

Команда 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 — True, если ФАЙЛ существует и является исполняемым.

Заключение

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

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

терминал bash

Связанные руководства

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *