- Как проверить, существует ли файл или каталог в Bash
- How to Check if a File or Directory Exists in Bash
- В Bash вы можете использовать тестовую команду, чтобы проверить, существует ли файл и определить тип файла.
- Проверьте, существует ли файл
- Проверьте, существует ли каталог
- Проверьте, не существует ли файл
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Вывод
- Как мне проверить, существует ли файл или файловый каталог в bash?
- 2 ответа
- Проверка существования файла и / или каталога
- Исправление синтаксической ошибки
- Блог системного администратора Windows/Linux/FreeBSD
- Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD
- Похожие записи:
- Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD : 8 комментариев
- Проверить существование файла
- Как проверить, существует ли файл или каталог в Bash
- Проверьте, существует ли файл
- Проверить, существует ли каталог
- Проверьте, не существует ли файла
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Выводы
Как проверить, существует ли файл или каталог в 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?
В настоящее время у меня есть этот сценарий bash (который находится в моем домашнем каталоге, т.е. /home/fusion809/ , и я запускаю его как root, поскольку это необходимо для строк копирования значков):
Я хочу, чтобы этот сценарий копировал значки из моего каталога Pictures/Icons and logos в подкаталоги темы scalable (указанной в $B ) в /usr/share/icons . Однако, прежде чем он это сделает, я бы хотел, чтобы он создал каталог scalable в этих подкаталогах темы, если он еще не существует. Проблема в том, что другая часть условных выражений не читается должным образом, поскольку я продолжаю получать эту ошибку:
Если вам интересно, почему test -e . в условном выражении, он основан на учебнике по сценариям bash, за которым я следил.
2 ответа
Проверка существования файла и / или каталога
Чтобы проверить, существует ли файл в bash, вы используете оператор -f . Для каталогов используйте -d . Пример использования:
Для получения дополнительной информации просто выполните man test .
Замечание о -e , этот тестовый оператор проверяет, существует ли файл. Хотя это может показаться хорошим выбором, лучше использовать -f , который вернет false, если файл не является обычным файлом. Например, /dev/null — это файл, а не обычный файл. В этом случае нежелательно, чтобы проверка вернула истину.
Примечание о переменных
Не забудьте также заключить переменные в кавычки, если у вас есть пробел или любой другой специальный символ, содержащийся в переменной, это может иметь нежелательные побочные эффекты. Поэтому, когда вы проверяете наличие файлов и каталогов, заключите файл / каталог в двойные кавычки. Что-то вроде [ -f «/path/to/some/$
Исправление синтаксической ошибки
У вас есть синтаксическая ошибка в операторах управления. Предложение bash if имеет следующую структуру:
Или необязательно с предложением else :
Вы не можете опустить предложение then . Если вы хотите использовать только предложение else , вы должны отрицать это условие. Результатом является следующий код:
Здесь мы добавляем восклицательный знак ( ! ), чтобы перевернуть оценку выражения. Если выражение истинно, то же выражение, которому предшествует ! , вернет ложь и наоборот.
Вы не можете пропустить часть then оператора if , самым простым решением было бы просто отрицать тест
Я оставил его с -e (существует), но вы можете рассмотреть возможность использования -d для каталогов или -f для файлов и некоторой обработки ошибок, чтобы отловить что-то (например, / usr / share / icons / $ j / scaleable / существует, но по какой-то причине является файлом, а не каталогом.) Я также заметил, что в исходном коде вы потенциально пытаетесь скопировать несколько файлов в один:
Я оставил это в своем примере на тот случай, если вы уверены, что это всегда только один файл, и намеренно переименовываете его. В противном случае я бы предложил указать только целевой каталог.
Источник
Блог системного администратора 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 проверить существование файла/директории, если существует — вывести путь, если не существует — ничего не выводить сейчас делаю так
test -r /boot/loader.conf && echo /boot/loader.conf
нужно упростить, чтоб не писать два раза проверяемый путь, т.к. проверок планируется много (конфиг Bacula)
f=/boot/loader.conf ; test -r $f && echo $f
Если это директория, то получится фигня.
Правильнее тогда уж ls -d /boot/loader.conf
Не подходит ни один из способов
backup# ls -d /boot/loader.conf
backup# ls -d /boot/loader.conf1
ls: /boot/loader.conf1: No such file or directory
backup# ls /boot/loader.conf 2>/dev/null
ls: 2: No such file or directory
backup# f=/boot/loader.conf ; test -r $f && echo $f
f=/boot/loader.conf: Command not found.
f: Undefined variable.
должна быть именно команда, а не часть скрипта, т.к. передается как команда на удаленную машину
backup# f=/boot/loader.conf ; test -r $f && echo $f
f=/boot/loader.conf: Command not found.
f: Undefined variable.
Фряха, небось? Тогда при чём тут bash?
У меня работает.
клиенты — те на которых будет выполняться команда разные freebsd 8-9, debian, cenots, потому нужно универсальное решение
У него фряха, а там csh.
Ты лучше скажи, для чего это нужно в итоге?
да, на debain — то что нужно, на freebsd
backup# ls /home/ivan/Downloads > /dev/null 2>&1 Ambiguous output redirect.
Bacula — система резервного копирования, хочу сделать единое правило для всех OS — описать какие файлы нужно резервировать.
Указываю пути — если в OS нет этого пути (к примеру /boot/loader.conf в debian) то задание заканчивается с ошибкой.
Есть возможность передавать на резервируемые клиенты не точный путь — а команду, которая вернет путь файла/директории для сохранения.
Потому и хочу все пути прописать как функции — если есть — отображаем путь, будет сохранятся. Если файла нет — ничего не возвращаем, попытки скопировать файл не будет.
Мой тебе совет: лучше сделай различные правила для фри и для линуксов.
Источник
Как проверить, существует ли файл или каталог в 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.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник