Как mkdir только если dir еще не существует? - PullRequest
1620 голосов
/ 27 апреля 2009

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

Есть мысли о том, как лучше это сделать?

Ответы [ 14 ]

2754 голосов
/ 27 апреля 2009

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

mkdir -p foo

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

mkdir -p foo/bar/baz

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

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

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

[ -d foo ] || mkdir foo
145 голосов
/ 27 апреля 2009

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

$ 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

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

81 голосов
/ 27 апреля 2009

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

man mkdir
mkdir -p foo
66 голосов
/ 22 августа 2013

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

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
30 голосов
/ 27 марта 2015

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

[ -d newdir ] || mkdir newdir

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

[ -d newdir ] && echo "Directory Exists" || mkdir newdir
18 голосов
/ 27 апреля 2009

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

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

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

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

13 голосов
/ 20 января 2014

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

Пример: -

mkdir -p foo

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

10 голосов
/ 16 декабря 2015
directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi
7 голосов
/ 22 ноября 2016

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

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

IF NOT EXIST dir_name MKDIR dir_name
7 голосов
/ 27 апреля 2009

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

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

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

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

...