Как узнать, существует ли файл в Bash?
У меня есть следующий скрипт на Bash, который проверяет, существует ли файл:
#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
echo "Файл $FILE существует."
else
echo "Файл $FILE не существует."
fi
Вопрос: как мне изменить этот код, чтобы проверять только то, что файл не существует?
5 ответ(ов)
Вопрос: Как проверить различные атрибуты файлов в Bash?
Ответ: В Bash вы можете использовать набор операторов для тестирования различных атрибутов файлов. Вот список доступных операторов:
-b filename
- проверить, является ли файл блочным специальным файлом.-c filename
- проверить, является ли файл специальным символом.-d directoryname
- проверить, существует ли директория.-e filename
- проверить, существует ли файл, независимо от типа (узел, директория, сокет, символическая ссылка и т.д.).-f filename
- проверить, существует ли регулярный файл (не директория).-G filename
- проверить, существует ли файл и принадлежит ли он эффективной группе.-G filename set-group-id
- вернуть true, если файл существует и установлен бит set-group-id.-k filename
- проверить установку sticky bit.-L filename
- проверить, является ли файл символической ссылкой.-O filename
- вернуть true, если файл существует и принадлежит эффективному пользователю.-r filename
- проверить, читаем ли файл.-S filename
- проверить, является ли файл сокетом.-s filename
- проверить, имеет ли файл ненулевой размер.-u filename
- проверить, установлен ли бит set-user-id.-w filename
- проверить, записываем ли файл.-x filename
- проверить, является ли файл исполняемым.
Пример использования:
#!/bin/bash
file=./file
if [ -e "$file" ]; then
echo "Файл существует"
else
echo "Файл не существует"
fi
Вы также можете инвертировать тестовое выражение, используя оператор !
#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
echo "Файл не существует"
else
echo "Файл существует"
fi
Таким образом, вы можете проверять различные атрибуты файлов с помощью вышеперечисленных операторов в зависимости от вашей задачи.
Вы можете использовать оператор !
для отрицания логического выражения внутри команды test
, для которой [
является алиасом. Вот пример кода на Bash, который показывает, как это сделать:
#!/bin/bash
FILE=$1
if [ ! -f "$FILE" ]
then
echo "Файл $FILE не существует"
fi
В этом примере используется конструкция [ ! -f "$FILE" ]
, где !
перед -f
проверяет, что файл не существует.
Также существует альтернативный способ, который не так часто используется, но который позволяет отрицать результат выполнения test
:
if ! [ -f "$FILE" ]
then
echo "Файл $FILE не существует"
fi
Здесь !
применяется к результату выполнения команды внутри квадратных скобок. Оба варианта корректны, и выбор зависит от ваших предпочтений.
Синтаксис команды test
и её использования с отрицанием можно найти в руководстве по командной строке, используя man test
, man [
или help test
в терминале. Кроме того, в "man 1 bash" это описано в секциях "Pipelines" и "Compound Commands".
Если вы хотите проверить, существует ли файл и является ли он обычным файлом, вы можете использовать следующую конструкцию:
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"
Однако, стоит отметить, что в этом случае есть вероятность, что файл может быть сломанной символической ссылкой или не обычным файлом, таким как сокет, устройство или fifo. Чтобы добавить проверку на сломанную символическую ссылку, вы можете использовать следующий код:
if [[ ! -f $FILE ]]; then
if [[ -L $FILE ]]; then
printf '%s is a broken symlink!\n' "$FILE"
else
printf '%s does not exist!\n' "$FILE"
fi
fi
Таким образом, в этом скрипте мы сначала проверяем, является ли файл обычным. Если нет, то проверяем, есть ли у него символическая ссылка, и выводим соответствующее сообщение.
Стоит отметить, что если вам нужно выполнить одну команду, вы можете сократить следующий код:
if [ ! -f "$file" ]; then
echo "$file"
fi
до более компактного вида:
test -f "$file" || echo "$file"
или
[ -f "$file" ] || echo "$file"
Чтобы проверить существование файла в Bash, вы можете использовать следующие параметры:
-e: Возвращает true, если файл существует (обычный файл, директория или символическая ссылка)
-f: Возвращает true, если файл существует и является обычным файлом
-d: Возвращает true, если файл существует и является директорией
-h: Возвращает true, если файл существует и является символической ссылкой
Все указанные тесты применимы как к обычным файлам, так и к директориям и символическим ссылкам:
-r: Возвращает true, если файл существует и доступен для чтения
-w: Возвращает true, если файл существует и доступен для записи
-x: Возвращает true, если файл существует и доступен для выполнения
-s: Возвращает true, если файл существует и имеет размер > 0
Пример скрипта для проверки существования файла:
#!/bin/bash
FILE=$1
if [ -f "$FILE" ]; then
echo "Файл $FILE существует"
else
echo "Файл $FILE не существует"
fi
В этом скрипте мы проверяем, существует ли указанный файл и является ли он обычным файлом с помощью условия -f
. Если файл существует, выводим соответствующее сообщение, иначе - уведомляем, что файл не найден.
Как перенаправить вывод в файл и на экран (stdout)
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как объявить и использовать логические переменные в shell-скрипте?
Как работает "cat << EOF" в bash?
Как в Bash-скрипте выйти из всего скрипта при выполнении определенного условия?