Чтобы создать каталог в Linux, вы используете команду mkdir. В конце концов, это означает «создать каталог». Это довольно простая команда.
Но когда вы пытаетесь создать уже существующий каталог, вы получаете сообщение об ошибке, например:
$ mkdir dir0 mkdir: cannot create directory ‘dir0’: File exists
Это означает, что если каталог уже существует, команда mkdir не будет пытаться каким-либо образом создать или изменить уже существующий каталог.
Но он также показывает ошибку, а это не то, что вам всегда нужно, особенно если вы пишете сценарий bash.
Чтобы предотвратить эту ошибку, используйте флаг -p вместе с командой mkdir.
mkdir -p dirname
Таким образом, хотя каталог не создается, он также не будет показывать никаких ошибок. Ваши скрипты будут работать как обычно.
Давайте посмотрим здесь подробнее и обсудим различные способы предотвращения этой ошибки.
Способ 1: используйте параметр «-p»
Если вы посмотрите на справочную страницу команды mkdir, у нее есть флаг «-p».
Использование флага «-p» в mkdir означает «нет ошибки, если она существует, создайте родительские каталоги по мере необходимости».
Когда вы используете флаг ‘-p’, утилита mkdir проверит, не существует ли уже каталог, файл, ссылка или канал с таким именем.
Если он существует, он не изменит ваш существующий каталог или файл и не покажет сообщение об ошибке.
mkdir -p dirname
нет вывода, потому что его не существует
Это очень удобно, когда вы создаете пользовательские сценарии bash и не хотите, чтобы их выполнение останавливалось из-за этой ошибки.
Также -p может использоваться для создания вложенной структуры каталогов. Если вы хотите создать структуру каталогов, аналогичную каталогу dir1/dir2/dir3, и некоторые каталоги или ни один из них не существует в иерархии.
Способ 2: проверьте, существует ли уже каталог в bash
Если вы пишете сценарии bash, вы можете использовать условие if и проверить, существует ли уже каталог . Если это не так, вы создаете каталог.
Вот пример кода:
if [ -d my_dir ] then mkdir my_dir fi
Способ 3: отправить в пустоту
Большинство инструментов UNIX имеют два потока вывода: stdout и stderr. Обычно оба потока, stdout и stderr, выводятся на терминал. Но вы можете перенаправить либо обычный поток вывода, либо поток ошибок в другой файл.
Итак, когда команда mkdir выдает ошибку на ваш терминал, вы можете перенаправить ее в пустоту.
Для перенаправления stdout используйте его вместе с числовым дескриптором потока «1», для stderr используйте числовой дескриптор потока «2». Вы также можете перенаправить стандартный ввод с помощью дескриптора потока «0».
Чтобы на самом деле перенаправить вывод, используйте соответствующий дескриптор потока вместе с оператором перенаправления ‘>’
$ mkdir dir0 2> /dev/null
Это отправит вывод stderr на устройство «/dev/null», которое отбрасывает все, что на него записывается.
Это абсолютно безопасно. Как мы упоминали ранее, если каталог уже существует, он не будет изменен. Будет показано только сообщение об ошибке. Все, что вы здесь делаете, это подавляете это сообщение об ошибке.
Лично мы бы выбрали первый метод, т.е. использование команды mkdir -p для обеспечения создания каталога только в том случае, если в том же месте нет файла или каталога с таким же именем.