- Как проверить, существует ли файл или каталог в Bash
- Проверьте, существует ли файл
- Проверьте, существует ли каталог
- Проверьте, не существует ли файл
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Заключение
- Проверка существования файла Bash
- Проверка существования файла Bash
- Проверка наличия файла
- Проверка файла на пустоту
- Выводы
- How To Check If File or Directory Exists in Bash
- How to Check if a File Exists
- How to Check if a Directory Exists
- How to Check if a File Does not Exist
- How to Check for Multiple Files
- File Test Operators to Find Prticular Types of Files
- Working with Code Snippets
Как проверить, существует ли файл или каталог в 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 существует"
Если вы хотите выполнить серию команд после оператора &&, просто заключите команды в фигурные скобки, разделенные ; или &&:
Напротив оператор &&, после оператора || будет выполняться только в том случае, если статус выхода команды 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 — Истина, если ФАЙЛ существует и является исполняемым.
Заключение
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Проверка существования файла 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.
How To Check If File or Directory Exists in Bash
Note: You may encounter the term bash script. This is a sequence of several commands to the shell. A script can be saved as a file and is often used to automate multiple system commands into a single action.
How to Check if a File Exists
To test for the file /tmp/test.log, enter the following from the command line:
The first line executes the test to see if the file exists. The second command, echo, displays the results 0 meaning that the file exists, 1 means no file was found.
In our example, the result was 1.
Now try creating a file, then testing for it:
As we have created the file beforehand, the result now is 0:
You can also use square brackets instead of the test command:
How to Check if a Directory Exists
To check if a directory exists, switch out the –f option on the test command for –d (for directory):
Create that directory, and rerun the test:
This command works the same as it does for files, so using brackets instead of the test command works here also.
Note: If you are searching for a file or directory because you need to delete it, refer to our guide on removing files and directories with Linux command line.
How to Check if a File Does not Exist
Typically, testing for a file returns 0 (true) if the file exists, and 1 (false) if the file does not exist. For some operations, you may want to reverse the logic. It is helpful if you write a script to create a particular file only if it doesn’t already exist.
To create a file if one doesn’t already exist, enter the following at a command line:
[ ! –f /tmp/test.txt ] && touch /tmp/test.txt
The exclamation point ! stands for not. This command makes sure there is not a file named test.txt in the /tmp directory. You won’t see anything happen.
To see if the system created the file, enter the following:
You should see test.txt listed. You can use a similar command for a directory – replace the –f option with –d:
[ ! –d /tmp/test ] && touch /tmp/test
How to Check for Multiple Files
To test for two files at the same time use the && option to add a second file:
[ -f /tmp/test.txt && -f /tmp/sample.txt ] && echo “Both files were found”
To test for multiple files with a wildcard, like an asterisk * to stand for various characters:
[ -f /tmp/*.jpg ] && echo “Files were found”
As usual, changing the –f option to –d lets you run the same test for multiple directories.
File Test Operators to Find Prticular Types of Files
Here are several commands to test to find specific types of files:
There are many other options available. Please consult the main page (test ––help) for additional options.
Working with Code Snippets
The previous commands work well for a simple two-line command at a command prompt. You can also use bash with multiple commands. When several commands are strung together, they are called a script.
A script is usually saved as a file and executed. Scripting also uses logical operators to test for a condition, then takes action based on the results of the test.
To create a script file, use the Nano editor to open a new file:
Enter one of the snippets from below, including the #!/bin/bash identifier. Use Ctrl-o to save the file, then Ctrl-x to exit Nano. Then, run the script by entering:
The following code snippet tests for the presence of a particular file. If the file exists, the script displays File exists on the screen.
#!/bin/bash if [ -f /tmp/test.txt ] then echo “File exists” fi
This works the same if you’re checking for a directory. Just replace the –f option with –d:
#!/bin/bash if [ -d /tmp/test ] then echo “File exists” fi
This command checks for the directory /tmp/test. If it exists, the system displays File exists.
You can now use bash to check if a file and directory exist. You can also create simple test scripts as you now understand the functions of a basic bash script file. Next, you should check out our post on Bash Function.