it-swarm.com.ru

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

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

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

1501
Spike Williams

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

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

$ 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

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

133
Alnitak

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

man mkdir
mkdir -p foo
76
jimmyorr

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

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

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

[ -d newdir ] || mkdir newdir

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

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

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

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

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

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

18
paxdiablo

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

Пример :-

mkdir -p foo

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

13
Atul Ranjan
directory_name = "foo"

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

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

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

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

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

7
alkar

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

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

IF NOT EXIST dir_name MKDIR dir_name
7
Karanvir Kang

Вы можете использовать цикл 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
AbhinavVaidya8
mkdir -p sam
  • mkdir = Создать каталог
  • -p = --parents
  • (без ошибок, если есть, создайте родительские каталоги по мере необходимости)
1
Paritosh Yadav

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

#----------------------------------
# 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
Balaji Boggaram Ramanarayan

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

1
vkrams