- Bash: Test If File Exists
- Bash Shell: Test If File Exists
- If File Exists, Then …
- Bash Script: Test If File Exists
- Test If File Exists And It Is …
- Как проверить, существует ли файл или каталог в Bash
- Проверьте, существует ли файл
- Проверить, существует ли каталог
- Проверьте, не существует ли файла
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Выводы
- Проверка существования файла Bash
- Проверка существования файла Bash
- Проверка наличия файла
- Проверка файла на пустоту
- Выводы
Bash: Test If File Exists
While creating a bash script, it is commonly helpful to test if file exists before attempting to perform some action with it.
This is a job for the test command, that allows to check if file exists and what type is it.
As only the check is done – the test command sets the exit code to 0 ( TRUE ) or 1 ( FALSE ), whenever the test succeeded or not.
Also the test command has a logical “not” operator which allows to get the TRUE answer when it needs to test if file does not exist.
Cool Tip: Create a clever bash script! Make it do more tests! Check easily whether a string exists in a file! Read more →
Bash Shell: Test If File Exists
Run one of the below commands to check whether a file exists:
Test if the file /etc/passwd exist ( TRUE ):
$ test -f /etc/passwd $ echo $? 0 $ [ -f /etc/passwd ] $ echo $? 0
Test if the file /etc/bebebe exist ( FALSE ):
$ test -f /etc/bebebe $ echo $? 1 $ [ -f /etc/bebebe ] $ echo $? 1
Test if the file /etc/bebebe does not exist ( TRUE ):
$ test ! -f /etc/bebebe $ echo $? 0 $ [ ! -f /etc/bebebe ] $ echo $? 0
If File Exists, Then …
We usually test if a file exists to perform some action depending on the result of the test.
Maybe if file doesn’t exist – there is no sens to move forward and it is required to break the script or whatever.
In the examples below, lets print corresponding messages depending on the results of the test command.
Cool Tip: The CASE statement is the simplest form of the IF-THEN-ELSE statement! If you have many ELIF elements – it is better to use the CASE ! Read more →
Test if the file /etc/passwd exists and print a message if it is TRUE :
$ if [ -f "/etc/passwd" ]; then echo "The file exists"; fi The file exists
Test if the file /etc/bebebe does not exist and print a message if it is TRUE :
$ if [ ! -f "/etc/bebebe" ]; then echo "The file does not exist"; fi The file does not exist
Test if the file exists and print a corresponding message in the each case:
$ [ -f "/etc/passwd" ] && echo "The file exists" || echo "The file does not exist" The file exists $ [ -f "/etc/bebebe" ] && echo "The file exists" || echo "The file does not exist" The file does not exist
Bash Script: Test If File Exists
Lets create a bash script, that will check whether a passed as an argument file exists or not, by printing a corresponding message.
Create an empty checkfile.sh file with the touch checkfile.sh command.
Make it executable with chmod +x checkfile.sh .
Open the checkfile.sh with a text editor and put the following code:
#!/bin/bash FILE=$1 if [ -f $FILE ]; then echo "The file '$FILE' exists." else echo "The file '$FILE' in not found." fi
Cool Tip: A good bash script prints usage and exits if arguments are not provided! It is very simple to configure! Read more →
Save and execute the script as follows:
$ ./checkfile.sh /etc/bebebe The file '/etc/bebebe' is not found. $ ./script.sh /etc/passwd The file '/etc/passwd' exists.
Test If File Exists And It Is …
In the examples above with the -f operator we only check whether a file exists and it is a regular file.
Here are some other useful options that can help to check whether a “file” exists and has specific permissions or it is a symbolic link, socket or a directory:
Option | Description |
---|---|
-e | Test if file exists, regardless of type (directory, socket, etc.) |
-f | Test if file exists and is a regular file |
-r | Test if file exists and read permission is granted |
-w | Test if file exists and write permission is granted |
-x | Test if file exists and execute permission is granted |
-L | Test if file exists and is a symbolic link |
-S | Test if file exists and is a socket |
-d | Test if directory exists |
Run man test to see all available operators.
Как проверить, существует ли файл или каталог в Bash
Часто при написании сценариев оболочки вы можете оказаться в ситуации, когда вам нужно выполнить действие в зависимости от того, существует файл или нет.
В Bash вы можете использовать команду test, чтобы проверить, существует ли файл, и определить тип файла.
Команда test принимает одну из следующих синтаксических форм:
test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]
Если вы хотите, чтобы ваш сценарий был переносимым, вам следует предпочесть старую команду test [ , которая доступна во всех оболочках POSIX. Новая обновленная версия тестовой команды [[ (двойные скобки) поддерживается в большинстве современных систем, использующих 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. Команда после оператора && будет выполнена только в том случае, если статус выхода тестовой команды — истина,
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 — Истина, если ФАЙЛ существует и является исполняемым.
Выводы
В этом руководстве мы показали вам, как проверить, существует ли файл или каталог в Bash.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Проверка существования файла Bash
В операционных системах GNU/Linux любые объекты системы являются файлами. И проверка существования файла bash — наиболее мощный и широко применяемый инструмент для определения и сравнения в командном интерпретаторе.
В рамках интерпретатора Bash, как и в повседневном понимании людей, все объекты файловой системы являются, тем, чем они есть, каталогами, текстовыми документами и т.д. В этой статье будет рассмотрена проверка наличия файла Bash, а также его проверка на пустоту, и для этого используется команда test.
Проверка существования файла Bash
Начать стоит с простого и более общего метода. Параметр -e позволяет определить, существует ли указанный объект. Не имеет значения, является объект каталогом или файлом.
#!/bin/bash
# проверка существования каталога
if [ -e $HOME ]
then
echo «Каталог $HOME существует. Проверим наличие файла»
# проверка существования файла
if [ -e $HOME/testing ]
then
# если файл существует, добавить в него данные
echo «Строка для существующего файла» >> $HOME/testing
echo «Файл существует. В него дописаны данные.»
else
# иначе — создать файл и сделать в нем новую запись
echo «Файл не существует, поэтому создается.»
echo «Создание нового файла» > $HOME/testing
fi
else
echo «Простите, но у вас нет Домашнего каталога»
fi
Вначале команда test проверяет параметром -e, существует ли Домашний каталог пользователя, название которого хранится системой в переменной $HOME. При отрицательном результате скрипт завершит работу с выводом сообщения об этом. Если такой каталог обнаружен, параметр -е продолжает проверку. На этот раз ищет в $HOME файл testing. И если он есть, то в него дописывается информация, иначе он создастся, и в него запишется новая строка данных.
Проверка наличия файла
Проверка файла Bash на то, является ли данный объект файлом (то есть существует ли файл), выполняется с помощью параметра -f.
#!/bin/bash
if [ -f $HOME ]
then
echo «$HOME — это файл»
else
echo «$HOME — это не файл»
if [ -f $HOME/.bash_history ]
then
echo «А вот .bash_history — файл»
fi
fi
В сценарии проверяется, является ли $HOME файлом. Результат проверки отрицательный, после чего проверяется настоящий файл .bash_history, что уже возвращает истину.
На заметку: на практике предпочтительнее использовать сначала проверку на наличие объекта как такового, а затем — на его конкретный тип. Так можно избежать различных ошибок или неожиданных результатов работы программы.
Проверка файла на пустоту
Чтобы определить, является ли файл пустым, нужно выполнить проверку с помощью параметра -s. Это особенно важно, когда файл намечен на удаление. Здесь нужно быть очень внимательным к результатам, так как успешное выполнение этого параметра указывает на наличие данных.
#!/bin/bash
file=t15test
touch $file
if [ -s $file ]
then
echo «Файл $file содержит данные.»
else
echo «Файл $file пустой.»
fi
echo «Запись данных в $file. »
date > $file
if [ -s $file ]
then
echo «Файл $file содержит данные.»
else
echo «Файл $file все еще пустой.»
fi
Результат работы программы:
В этом скрипте файл создаётся командой touch, и при первой проверке на пустоту возвращается отрицательный результат. Затем в него записываются данные в виде команды date, после чего повторная проверка файла возвращает истину.
Выводы
В статье была рассмотрена проверка существования файла bash, а также его пустоты. Обе функции дополняют друг друга, поэтому использовать их в связке — эффективный приём.
Хороший тон в написании сценариев командного интерпретатора — сначала определить тип файла и его дальнейшую роль в программе, а затем уже проверять объект на существование.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.