- Как проверить, существует ли файл или каталог в Bash
- How to Check if a File or Directory Exists in Bash
- В Bash вы можете использовать тестовую команду, чтобы проверить, существует ли файл и определить тип файла.
- Проверьте, существует ли файл
- Проверьте, существует ли каталог
- Проверьте, не существует ли файл
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Вывод
- Как мне проверить, существует ли файл или файловый каталог в bash?
- 2 ответа
- Проверка существования файла и / или каталога
- Исправление синтаксической ошибки
- Проверка существования файла Bash
- Проверка существования файла Bash
- Проверка наличия файла
- Проверка файла на пустоту
- Выводы
- Как мне узнать, что обычный файл не существует в Bash?
- 17 ответов
Как проверить, существует ли файл или каталог в 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 / существует, но по какой-то причине является файлом, а не каталогом.) Я также заметил, что в исходном коде вы потенциально пытаетесь скопировать несколько файлов в один:
Я оставил это в своем примере на тот случай, если вы уверены, что это всегда только один файл, и намеренно переименовываете его. В противном случае я бы предложил указать только целевой каталог.
Источник
Проверка существования файла Bash
В операционных системах GNU/Linux любые объекты системы являются файлами. И проверка существования файла bash — наиболее мощный и широко применяемый инструмент для определения и сравнения в командном интерпретаторе.
В рамках интерпретатора Bash, как и в повседневном понимании людей, все объекты файловой системы являются, тем, чем они есть, каталогами, текстовыми документами и т.д. В этой статье будет рассмотрена проверка наличия файла Bash, а также его проверка на пустоту, и для этого используется команда test.
Проверка существования файла Bash
Начать стоит с простого и более общего метода. Параметр -e позволяет определить, существует ли указанный объект. Не имеет значения, является объект каталогом или файлом.
Пример работы кода:
Вначале команда test проверяет параметром -e, существует ли Домашний каталог пользователя, название которого хранится системой в переменной $HOME. При отрицательном результате скрипт завершит работу с выводом сообщения об этом. Если такой каталог обнаружен, параметр -е продолжает проверку. На этот раз ищет в $HOME файл testing. И если он есть, то в него дописывается информация, иначе он создастся, и в него запишется новая строка данных.
Проверка наличия файла
Проверка файла Bash на то, является ли данный объект файлом (то есть существует ли файл), выполняется с помощью параметра -f.
Пример работы кода:
В сценарии проверяется, является ли $HOME файлом. Результат проверки отрицательный, после чего проверяется настоящий файл .bash_history, что уже возвращает истину.
На заметку: на практике предпочтительнее использовать сначала проверку на наличие объекта как такового, а затем — на его конкретный тип. Так можно избежать различных ошибок или неожиданных результатов работы программы.
Проверка файла на пустоту
Чтобы определить, является ли файл пустым, нужно выполнить проверку с помощью параметра -s. Это особенно важно, когда файл намечен на удаление. Здесь нужно быть очень внимательным к результатам, так как успешное выполнение этого параметра указывает на наличие данных.
Результат работы программы:
В этом скрипте файл создаётся командой touch, и при первой проверке на пустоту возвращается отрицательный результат. Затем в него записываются данные в виде команды date, после чего повторная проверка файла возвращает истину.
Выводы
В статье была рассмотрена проверка существования файла bash, а также его пустоты. Обе функции дополняют друг друга, поэтому использовать их в связке — эффективный приём.
Хороший тон в написании сценариев командного интерпретатора — сначала определить тип файла и его дальнейшую роль в программе, а затем уже проверять объект на существование.
Источник
Как мне узнать, что обычный файл не существует в Bash?
Я использовал следующий скрипт, чтобы проверить, существует ли файл:
Какой правильный синтаксис использовать, если я только хочу проверить, существует ли файл не ?
17 ответов
Команда тест ( [ здесь) имеет «не» логический оператор, который является восклицательным знаком (аналогично многим другим языкам). Попробуйте это:
Тестирование файлов Bash
-b filename — заблокировать специальный файл
-c filename — файл специальных символов
-d directoryname — проверка существования каталога
-e filename — Проверить существование файла независимо от его типа (узел, каталог, сокет и т. Д.)
-f filename — проверка на наличие обычного файла, а не каталога
-G filename — проверка, существует ли файл и принадлежит ли он эффективный идентификатор группы
-G filename set-group-id — True, если файл существует и является идентификатором группы-набора
-k filename — Sticky bit
-L filename — Символическая ссылка
—- +: = 9 =: + —- — True, если файл существует и принадлежит действующему идентификатору пользователя
-O filename — проверить, доступен ли файл для чтения.
-r filename — проверить, является ли файл сокетом
-S filename — проверить, не равен ли файл ненулевому размеру
-s filename — проверьте, установлен ли бит набора идентификаторов пользователя
-u filename — проверить, доступен ли файл для записи
-w filename — проверить, является ли файл исполняемым
Как использовать:
тестовое выражение можно отменить, используя оператор #!/bin/bash file=./file if [ -e «$file» ]; then echo «File exists» else echo «File does not exist» fi
Вы можете отменить выражение с помощью «!»:
Соответствующей справочной страницей является man test или, что эквивалентно, man [ — или help test или help [ для встроенной команды bash.
Также возможно, что файл является неработающей символической ссылкой или нерегулярным файлом, например, например. розетка, устройство или fifo. Например, чтобы добавить проверку на битые символические ссылки:
Стоит отметить, что если вам нужно выполнить одну команду, вы можете сократить
Я предпочитаю использовать следующий однострочный текст в формате, совместимом с POSIX :
Для пары команд, как я сделал бы в сценарии:
Как только я начал это делать, я уже редко использую полностью типизированный синтаксис !!
Чтобы проверить существование файла, параметр может быть одним из следующих:
Все приведенные ниже тесты применимы к обычным файлам, каталогам и символическим ссылкам:
Будьте осторожны с запуском test для переменной без кавычек, поскольку это может привести к неожиданным результатам:
Рекомендуется, чтобы проверяемая переменная была заключена в двойные кавычки:
Вы можете сделать это:
Если вы хотите проверить оба файла и папки, используйте -e вместо -f . -e возвращает true для обычных файлов, каталогов, сокетов, специальных символов, блокированных специальных файлов и т. д.
Есть три различных способа сделать это:
Отмените статус выхода с помощью bash (другой ответ не сказал этого):
Отложите тест внутри команды теста [ (именно так большинство ответов представили ранее):
Действуйте, чтобы результат теста был отрицательным ( || вместо && ):
Это выглядит глупо (IMO), не используйте его, если ваш код не должен переноситься на оболочку Bourne (например, /bin/sh Solaris 10 или более ранней версии), в котором отсутствовал оператор отрицания конвейера ( ! ):
команда [ выполняет команду stat() (не lstat() ) системный вызов для пути, сохраненного в $file и возвращает true , если этот системный вызов завершился успешно, и тип файла, возвращаемый stat() является «регулярным».
Таким образом, если [ -f «$file» ] возвращает true, вы можете сказать, что файл существует и является обычным файлом или символической ссылкой, в конечном итоге преобразующейся в обычный файл (или, по крайней мере, это было во время stat() ).
Однако, если он возвращает false (или если [ ! -f «$file» ] или ! [ -f «$file» ] верните true), есть много разных возможностей:
- файл не существует
- файл существует, но не является обычным файлом
- файл существует, но у вас нет разрешения на поиск в родительском каталоге
- файл существует, но путь к нему слишком длинный
- файл является символической ссылкой на обычный файл, но у вас нет разрешения на поиск в некоторых каталогах, связанных с разрешением символической ссылки.
- . любая другая причина, по которой системный вызов stat() может завершиться неудачей.
Короче говоря, это должно быть:
Чтобы точно знать, что файл не существует, нам потребуется системный вызов stat() для возврата с кодом ошибки ENOENT ( ENOTDIR говорит нам об одном из Компоненты пути не каталог, это другой случай, когда мы можем сказать, что файл не существует по этому пути). К сожалению, команда [ не сообщает нам об этом. Он вернет false, независимо от того, является ли код ошибки ENOENT, EACCESS (разрешение отклонено), ENAMETOOLONG или что-то еще.
Тест [ -e «$file» ] также можно выполнить с помощью ls -Ld — «$file» > /dev/null . В этом случае ls расскажет вам, почему stat() не удалось, хотя информация не может быть легко использована программно:
По крайней мере ls говорит мне, что это не потому, что файл не существует, потому что он выходит из строя. Это потому, что он не может определить, существует файл или нет. Команда [ просто проигнорировала проблему.
С помощью оболочки zsh вы можете запросить код ошибки с помощью $ERRNO специальная переменная после неудачной команды [ и декодировать это число с помощью $errnos специальный массив в модуле zsh/system :
Чтобы отменить тест, используйте «!». Это эквивалентно «не» логическому оператору в других языках. Попробуйте это:
Или написано немного по-другому:
Или вы можете использовать:
Или, прижимая все вместе:
Который может быть записан (используя операторы «и»: & &) как:
Источник