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

StackOverflow https://stackoverflow.com/questions/793858

Вопрос

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

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

Это было полезно?

Решение

Пытаться 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

Другие советы

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

$ 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

это тест существования оболочки Korn.

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

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

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

IF NOT EXIST dir_name MKDIR dir_name

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

1) каталог=/home/имя_каталога

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

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

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

mkdir -p sam
  • mkdir = Создать каталог
  • -p = --parents
  • (нет ошибок, если они существуют, при необходимости создайте родительские каталоги)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top