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

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

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

Ответ 1

Попробуйте 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

Ответ 2

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

$ 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

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

Ответ 3

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

man mkdir
mkdir -p foo

Ответ 4

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

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

Ответ 5

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

[ -d newdir ] || mkdir newdir

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

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

Ответ 6

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

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

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

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

Ответ 7

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

Пример: -

mkdir -p foo

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

Ответ 8

directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi

Ответ 9

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

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

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

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

Ответ 10

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

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

IF NOT EXIST dir_name MKDIR dir_name

Ответ 11

Вы можете использовать цикл 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

Ответ 12

Это простая функция (оболочка 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, которая рекурсивно создает каталоги. Надеюсь это поможет.

Ответ 13

mkdir -p sam
  • mkdir = Создать каталог
  • -p = - -p arents
  • (без ошибок, если есть, создайте родительские каталоги по мере необходимости)

Ответ 14

Ссылаясь на 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). По этой причине большинство людей используют эту команду в сценариях оболочки перед использованием этих реальных путей.

Ответ 15

Следующий код вызовет все ошибки, кроме ошибки "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"