Проверить что файл существует bash
Как узнать, существует ли обычный файл в Bash?
я использовал следующий скрипт, чтобы узнать, существует ли файл:
какой правильный синтаксис использовать, если я хочу только проверить, делает ли файл не?
17 ответов
Тестирование Файлов Bash
как использовать:
вы можете отрицать выражение с помощью «!»:
кроме того, возможно, что файл является сломанной символической ссылкой или нерегулярным файлом, например, сокетом, устройством или fifo. Например, чтобы добавить чек на сломанные символические ссылки:
стоит отметить, что если вам нужно выполнить одну команду можно сократить
Я предпочитаю делать следующий однострочный, в POSIX shell совместимый формат:
для нескольких команд, как я бы сделал в скрипте:
Как только я начал это делать,я редко использую полностью типизированный синтаксис!!
чтобы проверить существование файла, параметр может быть одним из следующих:
все тесты ниже применяются к обычным файлам, каталогам и символическим ссылкам:
вы должны быть осторожны при запуске test для некотируемой переменной, поскольку это может привести к неожиданным результатам:
рекомендация обычно состоит в том, чтобы тестируемая переменная была окружена двойными кавычками:
существуют три различных способа сделать это:
отрицание статуса выхода с bash (ни один другой ответ не сказал этого):
отрицание теста внутри команды test [ (именно так большинство ответов до этого представили):
действуйте на результат отрицательного теста ( || вместо && ):
вы можете сделать это:
короче говоря, это должно быть:
чтобы знать наверняка, что файл не существует, нам понадобится stat() системный вызов для возврата с кодом ошибки ENOENT ( ENOTDIR говорит нам, что один из компонентов пути не является каталогом, это еще один случай, когда мы можем сказать, что файл не существует по этому пути). К сожалению, [ команда не дает нам знать об этом. Он вернет false, является ли код ошибки ENOENT, EACCESS (разрешение отказано), ENAMETOOLONG или что-либо еще.
по крайней мере ls говорит мне, что это не потому, что файл не существует, что он терпит неудачу. Потому что он не может сказать, существует файл или нет. The [ команда просто проигнорировала проблему.
Как проверить, существует ли файл или каталог в Bash
Главное меню » Операционная система Linux » Как проверить, существует ли файл или каталог в Bash
В Bash вы можете использовать команду test, чтобы проверить, существует ли файл и определить тип файла.
Команда test принимает одну из следующих синтаксических форм:
Если вы хотите, чтобы ваш скрипт был переносимым, вы должны предпочесть использовать старую тестовую команду [, которая доступна во всех оболочках POSIX. Новая обновленная версия команды test [[(двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.
Проверьте, существует ли файл
Наиболее читаемым вариантом при проверке файла является использование команды test в сочетании с оператором if. Любой из приведенных ниже фрагментов проверит, /etc/resolv.conf существует ли файл:
Если вы хотите выполнить другое действие в зависимости от того, существует файл или нет, просто используйте конструкцию if/then:
Всегда используйте двойные кавычки, чтобы избежать проблем при работе с файлами, содержащими пробелы в своих именах.
Вы также можете использовать команду test без оператора if. Команда после оператора && будет выполнена только в том случае, если статус выхода команды test равен true,
Если вы хотите выполнить серию команд после оператора &&, просто заключите команды в фигурные скобки, разделенные ; или &&:
Напротив оператор &&, после оператора || будет выполняться только в том случае, если статус выхода команды test равен false.
Проверьте, существует ли каталог
Например, чтобы проверить, /etc/docker существует ли каталог, вы должны использовать:
Вы также можете использовать двойные скобки [[ вместо одной [.
Проверьте, не существует ли файл
Проверьте, существует ли несколько файлов
Эквивалентные варианты без использования оператора IF:
Операторы проверки файлов
Команда test включает в себя следующие операторы FILE, которые позволяют тестировать определенные типы файлов:
Заключение
В этой статье мы показали, как проверить, существует ли файл или каталог с помощью Bash.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Проверка существования файла Bash
В рамках интерпретатора Bash, как и в повседневном понимании людей, все объекты файловой системы являются, тем, чем они есть, каталогами, текстовыми документами и т.д. В этой статье будет рассмотрена проверка наличия файла Bash, а также его проверка на пустоту, и для этого используется команда test.
Проверка существования файла Bash
Начать стоит с простого и более общего метода. Параметр -e позволяет определить, существует ли указанный объект. Не имеет значения, является объект каталогом или файлом.
Пример работы кода:
Вначале команда test проверяет параметром -e, существует ли Домашний каталог пользователя, название которого хранится системой в переменной $HOME. При отрицательном результате скрипт завершит работу с выводом сообщения об этом. Если такой каталог обнаружен, параметр -е продолжает проверку. На этот раз ищет в $HOME файл testing. И если он есть, то в него дописывается информация, иначе он создастся, и в него запишется новая строка данных.
Проверка наличия файла
Проверка файла Bash на то, является ли данный объект файлом (то есть существует ли файл), выполняется с помощью параметра -f.
Пример работы кода:
В сценарии проверяется, является ли $HOME файлом. Результат проверки отрицательный, после чего проверяется настоящий файл .bash_history, что уже возвращает истину.
На заметку: на практике предпочтительнее использовать сначала проверку на наличие объекта как такового, а затем — на его конкретный тип. Так можно избежать различных ошибок или неожиданных результатов работы программы.
Проверка файла на пустоту
Чтобы определить, является ли файл пустым, нужно выполнить проверку с помощью параметра -s. Это особенно важно, когда файл намечен на удаление. Здесь нужно быть очень внимательным к результатам, так как успешное выполнение этого параметра указывает на наличие данных.
Результат работы программы:
В этом скрипте файл создаётся командой touch, и при первой проверке на пустоту возвращается отрицательный результат. Затем в него записываются данные в виде команды date, после чего повторная проверка файла возвращает истину.
Выводы
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 if the file /etc/bebebe exist ( FALSE ):
Test if the file /etc/bebebe does not exist ( TRUE ):
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.
Test if the file /etc/passwd exists and print a message if it is TRUE :
Test if the file /etc/bebebe does not exist and print a message if it is TRUE :
Test if the file exists and print a corresponding message in the each case:
Bash Script: Test If File Exists
Create an empty checkfile.sh file with the touch checkfile.sh command.
Open the checkfile.sh with a text editor and put the following code:
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:
Test If File Exists And It Is …
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.
How do I tell if a regular file does not exist in Bash?
I’ve used the following script to see if a file exists:
What’s the correct syntax to use if I only want to check if the file does not exist?
20 Answers 20
The test command ( [ here) has a «not» logical operator which is the exclamation point (similar to many other languages). Try this:
Bash File Testing
How to use:
You can negate an expression with «!»:
Also, it’s possible that the file is a broken symbolic link, or a non-regular file, like e.g. a socket, device or fifo. For example, to add a check for broken symlinks:
It’s worth mentioning that if you need to execute a single command you can abbreviate
I prefer to do the following one-liner, in POSIX shell compatible format:
For a couple of commands, like I would do in a script:
Once I started doing this, I rarely use the fully typed syntax anymore!!
To test file existence, the parameter can be any one of the following:
All the tests below apply to regular files, directories, and symlinks:
You should be careful about running test for an unquoted variable, because it might produce unexpected results:
The recommendation is usually to have the tested variable surrounded by double quotation marks:
In short, it should be:
To know for sure that the file doesn’t exist, we’d need the stat() system call to return with an error code of ENOENT ( ENOTDIR tells us one of the path components is not a directory is another case where we can tell the file doesn’t exist by that path). Unfortunately the [ command doesn’t let us know that. It will return false whether the error code is ENOENT, EACCESS (permission denied), ENAMETOOLONG or anything else.
At least ls tells me it’s not because the file doesn’t exist that it fails. It’s because it can’t tell whether the file exists or not. The [ command just ignored the problem.