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

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

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

13 ответов


попробовать mkdir -p:

mkdir -p foo

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

mkdir -p foo/bar/baz

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

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

[ -d foo ] || mkdir foo

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

$ 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

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


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

man mkdir
mkdir -p foo

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

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

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

[ -d newdir ] || mkdir newdir

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

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

старый испытанный и истинный

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

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

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


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

пример:

mkdir -p foo

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


directory_name = "foo"

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

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

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

- e - Это тест exist для оболочки korn.

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


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

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

IF NOT EXIST dir_name MKDIR dir_name

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

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

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

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

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

createDirectory/tmp/fooDir / BarDir

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


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