Cannot create directory как исправить

Новички в Linux часто не понимают, что делать при получении ошибки “mkdir: cannot create directory” во время работы с командной строкой. Есть несколько причин возникновения такой ошибки, и в этом переводе своей англоязычной статьи с сайта Unix Tutorial я покажу эти причины и их устрание на примерах.

mkdir: cannot create directory – File exists

В переводе с английского сообщение означает: невозможно создать каталог – файл уже существует.

ФАЙЛ существует? А при чём тут проблема создания каталога? И почему ошибка говорить “существует файл”, когда мы вообще пытаемся создавать каталог, а не файл?

На самом деле всё просто: большинство объектов в Linux являются файлами и структурами в файловой системе. Поэтому эта ошибка означает, что там, где вы пытаетесь выполнить команду создания нового каталога, уже существует другой объект с таким же именем. В данном случае – это файл, а не каталог. Но у файла такое же имя, как у желаемого каталога, так что создать второй объект с таким же именем не получится.

Например, ошибка

[email protected]:~$ mkdir /tmp/try
mkdir: cannot create directory – File exists

намекает, что у нас уже есть файл с именем /tmp/try.

Очень просто проверить эту гипотезу с помощью команды ls:

[email protected]:~$ ls -ald /tmp/try
drwxr-xr-x 2 greys root 4096 Nov 5 18:55 /tmp/try

Так и есть, у нас существует файл с таким именем.

Возможные решения проблем mkdir: cannot create directory

Сценарий file exists

Если файл с таким именем уже существует, а каталог всё же очень хочется создать, то есть решения.

Переименовать (или переместить) существующий файл

Используем команду mv для перемещения /tmp/try в другой каталог (или просто сменим имя try на другое, оставив файл в том же каталоге /tmp).
Вот как можно переименовать файл в имя oldtry:

[email protected]:~$ mv /tmp/try /tmp/oldtry

Теперь давайте попробуем ту же команду mkdir:

[email protected]:~$ mkdir /tmp/try

…и всё замечательно работает! Никаких ошибок, и создался новый каталог под названием /tmp/try.
Подтверждаем это с помощью команды ls:

[email protected]:~$ ls -ald /tmp/try /tmp/oldtry
drwxr-xr-x 2 greys root 4096 Nov 5 18:55 /tmp/oldtry
drwxrwxr-x 2 greys greys 4096 Nov 5 19:08 /tmp/try

Удалить существующий файл

Ещё одна опция, которая напрашивается сама собой – можно просто удалить неугодный файл, который мешает созаднию нашего нового каталога.

Для этого примера создадим новый пустой файл с названием /tmp/newtry

[email protected]:~$ touch /tmp/newtry
[email protected]:~$ ls -lad /tmp/newtry
-rw-rw-r-- 1 greys greys 0 Nov 5 20:50 /tmp/newtry

Если попробовать mkdir, то получится ожидаемая ошибка:

[email protected]:~$ mkdir /tmp/newtry
mkdir: cannot create directory '/tmp/newtry': File exists

А теперь мы просто удалим неугодный файл и попробуем mkdir снова:

[email protected]:~$ rm /tmp/newtry
[email protected]:~$ mkdir /tmp/newtry

В этот раз нет никаких ошибок, всё снова сработало:

[email protected]:~$ ls -lad /tmp/newtry
drwxrwxr-x 2 greys greys 4096 Nov 5 20:50 /tmp/newtry

##mkdir: cannot create directory – Permission denied

Это – ещё один распространённый сценарий при создании каталогов.

В переводе на русский, сообщение говорит: невозможно создать каталог – недостаточно прав доступа.
То есть файлов с таким же именем нет, но текущий пользователь, под которым мы пытаемся создать каталог, не имеет прав в текущем месте файловой системы для создания новых каталогов (и файлов).

Основной подход к такой ошибке – проверка прав доступа в каталоге, где получена ошибка. Команда ls и здесь поможет.
You should use ls command on the higher level directory to confirm permissions.

Например:

[email protected]:/tmp$ mkdir try2018
[email protected]:/tmp$ mkdir try2018/anotherone
[email protected]:/tmp$ ls -ald try2018
drwxrwxr-x 3 greys greys 4096 Nov 5 21:04 try2018

Все эти команды сработали без ошибок, и ls показывает, что у меня есть полные права доступа к каталогу try2018 – rwx для меня, rwx для моей группы и r-x для всех остальных (это я читаю фрагмент drwxrwxr-x в строке с try2018).

Теперь давайте уберём права на запись (и создание новых объектов) в каталоге try2018:

[email protected]:/tmp$ chmod a-w try2018
[email protected]:/tmp$ ls -ald try2018
dr-xr-xr-x 3 greys greys 4096 Nov 5 21:04 try2018

Теперь мои права к этому каталогу сменились с полных (rwx – read/write/execute) на только чтение (r-x – read/execute).
Так что если я попробую создать в try2018 какой-то подкаталог, выйдет та самая ошибка про недостаток прав доступа:

[email protected]:/tmp$ mkdir try2018/yetanotherone
mkdir: cannot create directory 'try2018/yetanotherone': Permission denied

Чтобы исправить проблему, нужно исправить права доступа на каталоге, где мы видим ошибку. И пробуем mkdir снова:

[email protected]:/tmp$ chmod a+w try2018
[email protected]:/tmp$ mkdir try2018/yetanotherone

Вот теперь – порядок, всё создалось,

[email protected]:/tmp$ ls -ald try2018/yetanotherone
drwxrwxr-x 2 greys greys 4096 Nov 5 21:05 try2018/yetanotherone

На сегодня – всё! Будут ещё вопросы по самым основам Linux – обращайтесь!

Скилл: Очень Новичек
На чём делаем: VPS
OS: centos-6-x86_64

При установке LAMP + Nginx вышла проблема, после создания юзеров, они у меня повторяют названия доменов. Пришло время создавать директории и вышла проблема. Сначала, после выполнения скрипта:

cd /home
for dir in `ls -1 `; do
mkdir /home/$dir/log
mkdir /home/$dir/html
chown -R $dir:apache $dir
chmod ug+rX $dir
done;

Вышла ошибка:

mkdir: cannot create directory `/home/domen.ru/log': File exists
mkdir: cannot create directory `/home/domen.ru/html': File exists
mkdir: cannot create directory `/home/domen2.ru/log': File exists
mkdir: cannot create directory `/home/domen2.ru/html': File exists

Потом решил просто создать директории “ручками”, через cd, ls и mkdir:

mkdir /home/domen.ru/log

Ответ:

mkdir: cannot create directory `/home/domen.ru/log': File exists

Что это и как лечить?


  • Вопрос задан

    более трёх лет назад

  • 22339 просмотров

Да, извините меня, была ошибка в написании и понимании, вообщем, рабочим для моего VPS стал скрипт:

cd /home
for dir in `ls -1 `; do
mkdir -p /home/$dir/log
mkdir -p /home/$dir/html
chown -R $dir:apache $dir
chmod ug+rX $dir
done;

или можно его так переделать, спасибо avalak:

cd /home
for dir in `ls -1 `; do
mkdir -p /home/$dir/{html,log}
chown -R $dir:apache $dir
chmod ug+rX $dir
done;

Всем спасибо, разобрался!

Пригласить эксперта

mkdir -p /home/$dir/{html,log}

[root@test home]# cd /domen.ru/log
Вы хотите попасть в каталог /home/domen.ru/log, а пытаетесь перейти в каталог /domen.ru/log

Решил, помог stackoverflow:

cd /home
for dir in `ls -1 `; do
mkdir -p /home/$dir/log
mkdir -p /home/$dir/html
chown -R $dir:apache $dir
chmod ug+rX $dir
done;

При этом, ошибки после выполнения скрипта нет, но когда хочется зайти в папку log домена domen.ru

[root@test home]# cd /domen.ru/log

сыпется ошибка:

-bash: cd: /domen.ru/log: No such file or directory

Короче вопрос открытый… Была мысль о том, что центуха так отвечает, потому что папки-то пустые, или я не прав?


  • Показать ещё
    Загружается…

18 мая 2023, в 23:42

1800 руб./за проект

18 мая 2023, в 22:57

500 руб./за проект

18 мая 2023, в 19:39

5000 руб./за проект

Минуточку внимания

Linux displays the file or directory permissions held by the user via the “ls -l” command. These permissions are of three types: “read”, “write”, and “execute”. The “read” permissions are represented by “r”, and “write” permissions are identified by “w”, and the “execute” is denoted by “x” in Linux.

This guide describes the causes and possible solutions for the issue “cannot create directory permission denied”. The outline of this article is as follows:

  • Reason: Permissions Not Granted
  • Solution: Allow the Directory Permissions

Let’s get into the reasons and the solutions of the error.

Reason: Permissions Not Granted

The error “cannot create directory permission denied” occurs because the currently logged-in user does not have the “write” permissions to create the directory. Suppose the user runs the “mkdir” command to create the directory “test” and “subtest1” as a subdirectory. It will not create as it shows the below error shown in the screenshot:

Check the “test” directory permissions by running the below-mentioned command:

The owner “itslinuxfoss” does not have the write permissions to create the “subtest1” directory as it only reads the “test” directory.

To resolve this type of error, the user needs to access the write permissions of the “test” directory

Solution: Allow the Directory Permissions

Change the “test” directory permissions to create the “subtest1” directory inside it. For this purpose, use the “chmod(Change Directory)” command with the combination of “a+w” and the target directory name in the terminal (Ctrl+Alt+T):

The “test” directory now has the “write” permissions.

Execute the “ls” command again to verify the new changes:

The output confirms that now the “test” directory has the “write” permissions to create a directory inside it.

Now run the “mkdir” command with the “subtest1” directory in the terminal. Now the below command will definitely create the “subtest1” directory without any error:

The output verifies that the error “cannot create directory permission denied” has been fixed now, and the “subtest1” is created successfully inside the “test” directory.

Alternative Solution: Change the Directory Ownership

Here is another solution to create the directory. To perform this task, change the ownership of the specified directory using the “chown” Linux command. Run the below command in the terminal to make the current user an “owner” of the directory:

$ sudo chown -R "$USER:" /path/to/the/directory

The above command contains the following components:

  • chown: Linux command that is useful to change the ownership of file/directory.
  • -R: This flag represents “recursive” as it changes the ownership of files and subdirectories located in a directory.
  • $USER: The current user replaces the global variable.
  • path/to/directory: Shows the specified directory path.

That’s all about the reasons and the solutions to the error “cannot create directory permission denied”.

Conclusion

The “cannot create directory permission denied” can be resolved by “Allowing the Directory Permissions”.The permissions of the desired directory can be changed by utilizing the “chmod(Change Directory)” command. This article has explained all the possible solutions to resolve the error “cannot create permission denied” in Linux.

Was your directory a FUSE-based network mount by any chance?

In addition to a file with that name already existing (other answer), this can happen when a FUSE process that once mounted something at this directory crashed (or was killed, e.g. with kill -9 or via the Linux OOM killer).

Check in mount if the FUSE mount is still listed there. If yes, you should be able to unmount it and fix the situation using fusermount -uz.

To see what is happening in detail, run strace -fy mkdir -p $directory, which shows all syscalls involved and their return values.


I consider the error messages emitted in this case a bug in mkdir -p (in particular the gnulib library):

When you run it on a dir that had a FUSE process mounted but that process crashed, it says

mkdir: cannot create directory ‘/mymount’: File exists

which is rather highly inaccurate, because the underlying stat() call returns ENOTCONN (Transport endpoint is not connected); but mkdir propagates up the less-specific error from the previous mkdir() sycall.
It’s extra confusing because the man page says:

   -p, --parents
          no error if existing, make parent directories as needed

so it shouldn’t error if the dir exists, yet ls -l / shows:

d????????? ? ?    ?       ?            ? files

so according to this (d), it is a directory, but it isn’t according to test -d.


I believe a better error message (which mkdir -p should emit in this case) would be:

mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected

New Linux users often get puzzled by the “mkdir: cannot create directory” errors when taking first steps and trying to learn basics of working with files and directories. In this short post I’ll show the two most common types of this mkdir error and also explain how to fix things so that you no longer get these errors.

mkdir: cannot create directory – File exists

This should be self explanatory after a few weeks of using commands like mkdir, but the first time you see this it can be confusing.

File exists? How can it be when you’re just trying to create a directory? And why does it say “File exists” when you’re trying to create a directory, not a file?

This error suggests that the directory name you’re using (/tmp/try in my example shown on the screenshot) is already taken – there is a file or a directory with the same name, so another one can’t be created.

Consider this scenario:

[email protected]:~$ mkdir /tmp/try
mkdir: cannot create directory – File exists

You can use the wonderful ls command to check what’s going on:

[email protected]:~$ ls -ald /tmp/try
drwxr-xr-x 2 greys root 4096 Nov 5 18:55 /tmp/try

Sure enough, we have a directory called /tmp/try already!

The reason it says “File exists” is because pretty much everything in Unix is a file. Even a directory!

Possible solutions to mkdir: cannot create directory – file exists scenario

Rename (move) existing directory

Use the mv command to move /tmp/try into some new location (or giving it new name). Here’s how to rename /tmp/try into /tmp/oldtry:

[email protected]:~$ mv /tmp/try /tmp/oldtry

Let’s rerun the mkdir command now:

[email protected]:~$ mkdir /tmp/try

…and since there are no errors this time, we probably have just created the /tmp/try directory, as desired. Let’s check both /tmp/try and the /tmp/oldtry with ls:

[email protected]:~$ ls -ald /tmp/try /tmp/oldtry
drwxr-xr-x 2 greys root 4096 Nov 5 18:55 /tmp/oldtry
drwxrwxr-x 2 greys greys 4096 Nov 5 19:08 /tmp/try

Remove existing file

Another option you always have is to simply remove the file that’s blocking your mkdir command.

First, let’s create an empty file called /tmp/newtry and confirm it’s a file and not a directory usng ls command:

[email protected]:~$ touch /tmp/newtry
[email protected]:~$ ls -lad /tmp/newtry
-rw-rw-r-- 1 greys greys 0 Nov 5 20:50 /tmp/newtry

Now, if we try mkdir with the same name, it will fail:

[email protected]:~$ mkdir /tmp/newtry
mkdir: cannot create directory '/tmp/newtry': File exists

So, to fix the issue, we remove the file and try mkdir again:

[email protected]:~$ rm /tmp/newtry
[email protected]:~$ mkdir /tmp/newtry

This time there were no errors, and ls command can show you that indeed you have a directory called /tmp/newtry now:

[email protected]:~$ ls -lad /tmp/newtry
drwxrwxr-x 2 greys greys 4096 Nov 5 20:50 /tmp/newtry

mkdir: cannot create directory – Permission denied

This is another very common error when creating directories using mkdir command.

The reason for this error is that the user you’re running the mkdir as, doesn’t have permissions to create new directory in the location you specified.

You should use ls command on the higher level directory to confirm permissions.

Let’s proceed with an example:

[email protected]:/tmp$ mkdir try2018
[email protected]:/tmp$ mkdir try2018/anotherone
[email protected]:/tmp$ ls -ald try2018
drwxrwxr-x 3 greys greys 4096 Nov 5 21:04 try2018

All of these commands succeeded because I first created new directory called try2018, then another subdirectory inside of it. ls command confirmed that I have 775 permissions on the try2018 directory, meaning I have read, write and execture permissions.

Now, let’s remove the write permissions for everyone for directory try2018:

[email protected]:/tmp$ chmod a-w try2018
[email protected]:/tmp$ ls -ald try2018
dr-xr-xr-x 3 greys greys 4096 Nov 5 21:04 try2018

If I try creating a subdirectory now, I will get the mkdir: cannot create directory – permissions denied error:

[email protected]:/tmp$ mkdir try2018/yetanotherone
mkdir: cannot create directory 'try2018/yetanotherone': Permission denied

To fix the issue, let’s add write permissions again:

[email protected]:/tmp$ chmod a+w try2018
[email protected]:/tmp$ mkdir try2018/yetanotherone

As you can see, try2018/yetanotherone directory was successfully created:

[email protected]:/tmp$ ls -ald try2018/yetanotherone
drwxrwxr-x 2 greys greys 4096 Nov 5 21:05 try2018/yetanotherone

That’s it for today! Hope you liked this tutorial, be sure to explore more basic Unix tutorials on my blog.

See Also
Basic Unix commands
mkdir command in Unix
File types in Unix
chmod and chown
Unix commands tutorial

See also

  • Advanced Unix Commands
  • Basic Unix Commands
  • Unix Commands tutorial
  • chmod vs chown

Добавить комментарий