Как mkdir только в том случае, если dir еще не существует?

Я пишу оболочку script для запуска под KornShell (ksh) в AIX. Я хотел бы использовать команду mkdir для создания каталога. Но каталог уже может существовать, и в этом случае я не хочу ничего делать. Поэтому я хочу либо проверить, что каталог не существует, либо подавить ошибку "File exists", которую mkdir бросает, когда пытается создать существующий каталог.

Любые мысли о том, как лучше всего это сделать?

1468
27 апр. '09 в 17:47
источник поделиться
15 ответов

Попробуйте mkdir -p:

mkdir -p foo

Обратите внимание, что это также создаст любые промежуточные каталоги, которые не существуют; например,

mkdir -p foo/bar/baz

создаст каталоги foo, foo/bar и foo/bar/baz если они не существуют.

Некоторые реализации, такие как GNU mkdir включают в себя mkdir --parents как более читаемый псевдоним, но это не указано в спецификации POSIX/Single Unix, поэтому этого следует избегать.

Если вам нужна ошибка, когда родительские каталоги не существуют, и вы хотите создать каталог, если он не существует, то вы можете сначала test существование каталога:

[ -d foo ] || mkdir foo
2523
27 апр. '09 в 17:49
источник

Это должно работать:

$ mkdir -p dir

или

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

который создаст каталог, если он не существует, но предупредите, если имя создаваемого вами каталога уже используется чем-то другим, кроме каталога.

127
27 апр. '09 в 17:50
источник

Используйте флаг -p.

man mkdir
mkdir -p foo
74
27 апр. '09 в 17:50
источник

Определение сложных деревьев каталогов с помощью одной команды

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
65
21 авг. '13 в 23:08
источник

Если вы не хотите показывать сообщение об ошибке:

[ -d newdir ] || mkdir newdir

Если вы хотите показать свое собственное сообщение об ошибке:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir
27
27 марта '15 в 6:57
источник

Старый проверенный и достоверный

mkdir /tmp/qq >/dev/null 2>&1

будет делать то, что вы хотите, ни в одной из условий гонки, из-за чего многие другие решения не имеют.

Иногда самые простые (и самые уродливые) решения являются лучшими.

18
27 апр. '09 в 18:00
источник

mkdir foo работает, даже если каталог существует. Чтобы он работал, только если каталог с именем "foo" не существует, попробуйте использовать флаг -p.

Пример: -

mkdir -p foo

Это создаст каталог с именем "foo", только если он не существует.:)

12
20 янв. '14 в 15:23
источник
directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi
10
16 дек. '15 в 14:34
источник

mkdir больше не поддерживает -p в системах Windows 8+.

Вы можете использовать это:

IF NOT EXIST dir_name MKDIR dir_name
7
22 нояб. '16 в 15:39
источник

Или если вы хотите сначала проверить наличие:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e - это существующий тест для оболочки korn.

Вы также можете попробовать выполнить русификацию руководства по оболочке korn.

7
27 апр. '09 в 17:51
источник

Вы можете использовать цикл if, чтобы проверить, существует ли каталог или нет, если он не выходит, чем создать каталог.

1) dir =/home/dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2) Для создания каталога вы можете использовать mkdir с опцией -p. Он проверит, если каталог не доступен, он будет.

mkdir -p $dir

mkdir -p также позволяет создавать древовидную структуру каталога. Если вы хотите создать родительский и дочерний каталоги с помощью одной и той же команды, можете выбрать mkdir -p

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
2
21 авг. '18 в 7:56
источник

Это простая функция (оболочка bash), которая позволяет вам создавать каталог, если он не существует.

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

Вы можете вызвать вышеуказанную функцию как:

createDirectory/tmp/fooDir/BarDir

Приведенное выше создает fooDir и BarDir, если они не существуют. Обратите внимание на параметр "-p" в команде mkdir, которая рекурсивно создает каталоги. Надеюсь это поможет.

1
14 февр. '18 в 21:54
источник

Ссылаясь на man-страницу man mkdir для опции - p

   -p, --parents
          no error if existing, make parent directories as needed

который создаст все каталоги по заданному пути, если существует, не выдаст ошибку, иначе он создаст все каталоги слева направо по заданному пути. Попробуйте команду ниже. каталоги newdir и anotherdir не существует до выдачи этой команды

Правильное использование

mkdir -p/tmp/newdir/anotherdir

После выполнения команды вы можете увидеть newdir и еще один anotherdir созданный в /tmp. Вы можете выполнить эту команду столько раз, сколько захотите, команда всегда имеет exit(0). По этой причине большинство людей используют эту команду в сценариях оболочки перед использованием этих реальных путей.

0
22 янв. '19 в 2:46
источник
mkdir -p sam
  • mkdir = Создать каталог
  • -p = - -p arents
  • (без ошибок, если есть, создайте родительские каталоги по мере необходимости)
0
20 апр. '18 в 12:30
источник

Следующий код вызовет все ошибки, кроме ошибки "dir уже существует". Он также потерпит неудачу, если файл с именем "dirName" уже существует:

import subprocess

dirName='myNewDir'

failed=subprocess.call(['mkdir', '-p', dirName])

if failed !=0: raise Exception, 'Failed to create dir %s.'%(dirName)

Кроме того, он будет создавать каталоги рекурсивно, т.е.

dirName='./dir1/dir2'

создаст как "dir1", так и "dir2"

-4
04 дек. '17 в 22:56

Посмотрите другие вопросы по меткам или Задайте вопрос