Кто говорит, тот сеет, кто слушает, тот собирает жатву (П. Буаст).

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

4 мин для чтения
FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
16 марта 2019
Как проверить, существует ли файл или каталог в Bash
При написании сценариев Shell вы можете оказаться в ситуации, когда вам нужно выполнить действие, основанное на том, существует файл или нет.

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

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

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

 

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

 

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

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

FILE=/etc/resolv.conf
if test -f "$FILE"; then
    echo "$FILE существует"
fi

 

FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE существует"
fi

 

FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
    echo "$FILE существует"
fi

 

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

FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE существует"
else 
    echo "$FILE не существует"
fi

 

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

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

test -f /etc/resolv.conf && echo "$FILE существует"

 

[ -f /etc/resolv.conf ] && echo "$FILE существует"

 

[[ -f /etc/resolv.conf ] && echo "$FILE существует"

 

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

[ -f /etc/resolv.conf ] && { echo "$FILE существует"; cp "$FILE" /tmp/; }

 

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

[ -f /etc/resolv.conf ] && echo "$FILE существует" || echo "$FILE не существует"

 

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

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

FILE=/etc/docker
if [ -d "$FILE" ]; then
    echo "$FILE являться каталогом"
fi

 

[ -d /etc/docker ] && echo "$FILE являться каталогом"

 

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

 

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

FILE=/etc/docker
if [ ! -f "$FILE" ]; then
    echo "$FILE существует, и это каталог"
fi

 

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

[ ! -f /etc/docker ] || echo "$FILE не существует"

 

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

FILE=/etc/docker
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
    echo "$FILE это каталог"
fi

 

FILE=/etc/docker
if [ -f /etc/resolv.conf && -f /etc/hosts ]; then
    echo "$FILE iэто каталог"
fi

 

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

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "оба файла существуют"

 

[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "оба файла существуют"

 

Команда 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.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Просмотров: 107

Если статья понравилась, то поделитесь ей в социальных сетях:

Отправить ответ

Войти с помощью: 
avatar
  Подписаться  
Уведомление о

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить
galka

Спасибо! Ваша заявка принята

close
galka

Спасибо! Ваша заявка принята

close