Linux условие если файл не существует

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

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

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

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

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

Проверьте, существует ли файл

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

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

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

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

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

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

Проверить, существует ли каталог

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

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

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

Проверьте, не существует ли файла

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

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

Проверьте, существует ли несколько файлов

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

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

Операторы проверки файлов

Команда 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 — Истина, если ФАЙЛ существует и является исполняемым.
Читайте также:  Hyper v windows 10 сетевой адаптер

Выводы

В этом руководстве мы показали вам, как проверить, существует ли файл или каталог в Bash.

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

Источник

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

Главное меню » Операционная система Linux » Как проверить, существует ли файл или каталог в Bash

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

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

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

Проверьте, существует ли файл

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

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

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

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

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

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

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

Проверьте, существует ли каталог

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

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

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

Проверьте, не существует ли файл

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

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

Проверьте, существует ли несколько файлов

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

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

Операторы проверки файлов

Команда 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 – Истина, если ФАЙЛ существует и является исполняемым.
Читайте также:  Documents and settings all users application data windows

Заключение

В этой статье мы показали, как проверить, существует ли файл или каталог с помощью Bash.

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

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

Источник

Блог системного администратора Windows/Linux/FreeBSD

Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD

Представлю вам скрипт, который архивирует файл, если он есть в заданной директории. Если файла нет — архив не создается.

Остальные ключи проверки файлов/каталогов:

Второй вариант bash-скрипта для проверки условия существования файлов и их архивирования при наличии:

Третий вариант проверки условия существования любых файлов в каталоге:

#Задаем переменную директории
DIR=/000/test/test

#вычисляем количество файлов, которые есть в заданной директории
filecount=`find $DIR -type f | wc -l`

#если количество файлов равно нулю, то есть их нет, то выдается сообщение
if [ $filecount -eq 0 ];
then
echo «Файлов нет, выполняем скрипт дальше»
else
echo «Есть файлы, прекращаем работу скрипта» && exit
fi

Четвертый вариант проверки условия существования любых файлов в каталоге с бесконечным циклом:

while true
do
case `find $DIR -type f | wc -l` in
0 ) echo «no file» ;; #Если файлов нет — выводится сообщение (или можно подставить любой ваш скрипт или команду)
* ) sleep 5 ;; #если файлы в каталоге есть — ждем 5 секунд и дальше проверяем по-новому (к первому шагу)
esac
done
exit 0

Похожие записи:

Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD : 8 комментариев

Подскажите, а как будет выглядеть скрипт, который не даст дальнейшее выполнение основного скрипта, пока в указанном каталоге присутствуют файлы (любые), с любым именем и расширением?

Алексей, я добавил в статью вариант под вашу нужду. Пойдет?

Третий вариант, я думаю тоже возьму на заметку, но
если можно покажите пример, в котором бы
был как я понимаю бесконечный цикл проверки на наличия файлов.

То есть почти как третий вариант, только если файлы есть, то работа скрипта не прекращалась вообще, а допустим был бы sleep 5 и после него проверка повторялась и так до тех пор пока каталог не будет пустым и только тогда пойдёт выполнение скрипта далее.

Четвертый вариант пойдет? Я проверил — работает так, как вам нужно, если я правильно понял.

То что надо!
Спасибо

Не могу понять, пишу это на роутере.
Под sh выполняется всё корректно find $DIR -type f | wc -l,
а когда сам роутер выполняет эту команду, то почему то
она всё время пишет ноль файлов в каталоге, хотя они там есть.

Если быть точнее, то пишу скрипт:

filecount=`find /opt/var/spool/sms/failed/ -type f | wc -l`
echo -e $filecount >> /tmp/status

Читайте также:  System file defragmenter для windows 10

если данный скрипт выполнить под ssh, то всё ок, а если
его выполняет cron, то всё время получаю ноль.

Вроде разобрался, указал до команды find полный путь.

Источник

Проверка существования файла 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, а также его пустоты. Обе функции дополняют друг друга, поэтому использовать их в связке — эффективный приём.

Хороший тон в написании сценариев командного интерпретатора — сначала определить тип файла и его дальнейшую роль в программе, а затем уже проверять объект на существование.

Источник

Оцените статью