- Как проверить, существует ли файл или каталог в Bash
- Проверьте, существует ли файл
- Проверить, существует ли каталог
- Проверьте, не существует ли файла
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Выводы
- Блог системного администратора Windows/Linux/FreeBSD
- Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD
- Похожие записи:
- Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD : 8 комментариев
- Как проверить, существует ли файл или каталог в Bash
- How to Check if a File or Directory Exists in Bash
- В Bash вы можете использовать тестовую команду, чтобы проверить, существует ли файл и определить тип файла.
- Проверьте, существует ли файл
- Проверьте, существует ли каталог
- Проверьте, не существует ли файл
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Вывод
- Проверка наличия файла из bash-скрипта
Как проверить, существует ли файл или каталог в 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 — Истина, если ФАЙЛ существует и является исполняемым.
Выводы
В этом руководстве мы показали вам, как проверить, существует ли файл или каталог в Bash.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
Блог системного администратора 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
если данный скрипт выполнить под ssh, то всё ок, а если
его выполняет cron, то всё время получаю ноль.
Вроде разобрался, указал до команды find полный путь.
Источник
Как проверить, существует ли файл или каталог в Bash
How to Check if a File or Directory Exists in Bash
В Bash вы можете использовать тестовую команду, чтобы проверить, существует ли файл и определить тип файла.
Во многих случаях при написании сценариев Shell вы можете оказаться в ситуации, когда вам нужно выполнить действие, основанное на том, существует файл или нет.
Команда test принимает одну из следующих синтаксических форм:
Если вы хотите, чтобы ваш скрипт был переносимым, вам следует использовать старую [ команду test , которая доступна во всех оболочках POSIX. Новая обновленная версия команды test [[ (двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.
Проверьте, существует ли файл
При проверке существования файла чаще всего используются операторы FILE -e и -f . Первый проверит, существует ли файл независимо от его типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (не каталогом или устройством).
Наиболее читаемым вариантом при проверке существования файла является использование test команды в сочетании с if оператором . Любой из фрагментов ниже проверит, /etc/resolv.conf существует ли файл:
Вы также можете использовать команду test без оператора if. Команда после && оператора будет выполнена только в том случае, если статус выхода тестовой команды равен true,
Напротив && , оператор после || оператора будет выполняться только в том случае, если статус выхода команды test равен false .
Проверьте, существует ли каталог
Операторы -d позволяют проверить, является ли файл каталогом или нет.
Например, чтобы проверить, /etc/docker существует ли каталог, вы должны использовать:
Вы также можете использовать двойные скобки [[ вместо одной [ .
Проверьте, не существует ли файл
Как и во многих других языках, тестовое выражение можно отменить, используя ! логический оператор not (восклицательный знак):
То же, что и выше:
Проверьте, существует ли несколько файлов
Вместо использования сложных вложенных конструкций if / else вы можете использовать -a (или && с [[ ), чтобы проверить, существует ли несколько файлов:
Операторы проверки файлов
Команда test включает в себя следующие операторы FILE, которые позволяют вам тестировать определенные типы файлов:
- -b FILE — Истина, если ФАЙЛ существует и является специальным файлом блока.
- -c FILE — Истина, если ФАЙЛ существует и является файлом специальных символов.
- -d FILE — Истина, если ФАЙЛ существует и является каталогом.
- -e FILE — Истина, если ФАЙЛ существует и является файлом, независимо от его типа (узел, каталог, сокет и т. Д.).
- -f FILE — Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
- -G FILE — Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
- -h FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
- -g FILE — Истина, если ФАЙЛ существует и установлен sgid флаг set -group-id ( ).
- -k FILE — Истина, если ФАЙЛ существует и установлен флаг закрепления битов.
- -L FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
- -O FILE — Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
- -p FILE — Истина, если ФАЙЛ существует и является каналом.
- -r FILE — Истина, если ФАЙЛ существует и доступен для чтения.
- -S FILE — Истина, если ФАЙЛ существует и является сокетом.
- -s FILE — Истина, если ФАЙЛ существует и имеет ненулевой размер.
- -u FILE — Истина, если ФАЙЛ существует и установлен suid флаг set-user-id ( ).
- -w FILE — Истина, если ФАЙЛ существует и доступен для записи.
- -x FILE — Истина, если ФАЙЛ существует и является исполняемым.
Вывод
В этом руководстве мы показали, как проверить, существует ли файл или каталог в Bash.
Источник
Проверка наличия файла из bash-скрипта
Привет! Никак не могу понять, в чем дело. Вроде, все как в манах:
Почему не находит-то?
Система debian 6.0.6 squeeze.
- пробелы забыл.
- $file надо в «кавычки занести.
- под рутом работают только идиоты.
Если руки постоянно чешутся, то лучше к компу вобще не подходить — сломаешь.
Может вам вообще упростить:
Да я и не знал про них. Статейка, из которой пример, отформатирована так, что они едва заметны.
На случай пробелов, спецсимволов и т.д.? Спасибо, сделаю.
под рутом работают только идиоты.
Да я и не работаю, я пытаюсь настроить роутер. Постоянно вдалбливать sudo в процессе надоедает. А когда все отлажено будет, на сервак и лазать никто не станет.
Спасибо за вариант, попробую разобраться. Я только начал вникать в bash-скрипты (хочу накатать самостоятельно элементарный бэкапер) — это какой-то дурдом! Них$я не понятно и не очевидно. Даже самые простые вещи до невозможности запутаны.
Вот, к примеру, элементарное арифметическое действие:
Ну и в чем тут разница и где логика.
Или, к примеру, элементарное логическое выражение для блока IF. Как я только не бился, но логическую конструкцию вида
так и не смог соорудить.
Абзац! А я-то еще рассчитывал курить бросить в новом году.
Да я и не знал про них. Статейка, из которой пример, отформатирована так, что они едва заметны.
на будущее: в баше пробелы ВАЖНЫ. Лучше их побольше поставить, чем поменьше. Если X надо отделить от Y, то пиши X Y, а то баш такой, он это как XY воспринимает.
На случай пробелов, спецсимволов и т.д.? Спасибо, сделаю.
двойные кавычки выручают во многих других случаях. Если в $var пусто, то это в натуре ПУСТО, а совсем НЕ «пустая строка символов», как ты надеялся. А вот «$var» это действительно пустая строка. Это самый примитивный случай, дальше — хуже.
Да я и не работаю, я пытаюсь настроить роутер. Постоянно вдалбливать sudo в процессе надоедает. А когда все отлажено будет, на сервак и лазать никто не станет.
а. ну ладно. Хотя я скрипты под юзером отлаживаю. Потом в продакшен переношу. Это Хорошая Идея, даже если «продакшен» == твой localhost.
Спасибо за вариант, попробую разобраться. Я только начал вникать в bash-скрипты (хочу накатать самостоятельно элементарный бэкапер) — это какой-то дурдом! Них$я не понятно и не очевидно. Даже самые простые вещи до невозможности запутаны.
bash очень стар, и сильно обвешан костылями для совместимости. Это нужно помнить.
слишком сложно. Попробуй так:
Или, к примеру, элементарное логическое выражение для блока IF. Как я только не бился, но логическую конструкцию вида a && (b || c) так и не смог соорудить.
что ты хотел здесь сделать? Данная конструкция вычисляется так:
- вычисляется a
- если a ложное (не равно 0), то вычисления прерываются
- иначе вычисляется выражение в скобках
проблема в том, что если в C эти твои a,b,c это выражения, то в bash это строки. Потому и не работает. В C тоже строки так не работают.
drBatty, спасибо за ответ!
Не конкретно в этом примере. Была параллельная задача. Если $2 задано и ($2 = «красота» или $2 = «лепота»), то.
Пробовал разнообразнейшие варианты, навроде:
если a ложное (не равно 0), то вычисления прерываются иначе вычисляется выражение в скобках
Ты имеешь в виду вложенные условные блоки? А-ля реализация конъюнкции в виде:
З.Ы. Наверное ты прав, с такими экспериментами скрипты лучше из-под юзера отлаживать.
Ну вот опять! Ну что тут может быть не так? Все по манам вроде:
Источник