Как 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"