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

How to Check if a File or Directory Exists in Bash

7 Июня 2020 | Терминал

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

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

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

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

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
 

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


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

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

Наиболее читаемым вариантом при проверке существования файла является использование 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
 

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

Вы также можете использовать команду test без оператора 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/; }
 

Напротив && , оператор после || оператора будет выполняться только в том случае, если статус выхода команды test равен 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."
 

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


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

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

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


Вывод 

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


    Комментарии

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

Загрузка комментариев...