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