What is the difference in what is being performed by mkdir -p and install -d, in terms of what changes the two commands are doing to the system?
- 9,850
2 Answers
The main difference between mkdir -p and install -d is that if the directory already exists, only install -d will try to set the ownership and file mode bits.
install -dwill callmake_dir_parentswithpreserve_existingset tofalsemkdir -pwill callmake_dir_parentswithpreserve_existingset totrue.
If preserve_existing is true and the directory already exists, the function will not attempt to set the ownership and file mode bits.
mkdir -p and install -d in coreutils call the exact same make_dir_parents function.
Coreutil sources:
- 9,850
For starters, mkdir -p is POSIX, install is not. Then, we have this from the GNU install documentation:
If the
--directory(-d) option is given,installcreates each directory and any missing parent directories. Parent directories are created with mode ‘u=rwx,go=rx’ (755), regardless of the-moption or the current umask. See Directory Setuid and Setgid, for how the set-user-ID and set-group-ID bits of parent directories are inherited.
And:
‘
-d’
‘--directory’
Create any missing parent directories, giving them the default attributes. Then create each given directory, setting their owner, group and mode as given on the command line or to the defaults.
So:
- For GNU
install, the permissions of the parent directories could be different. installlets you set the ownership of the leaf directory.
- 72,889
install -dmight not be POSIX, but don't quote me on that. – phk Jan 25 '17 at 23:13busyboxby comparing mkdir.c and install.c you see that there is some difference when it comes to handling file modes, in latter (install) the folders are apparently first created with a hardcoded file mode of0755and only later set to a different value. (Some sort of workaround for certain GNU coreutils versions? Can someone more knoledgable please explain?) Also in latter the user and group ID can be specifically set. I ignored SELINUX. – phk Jan 25 '17 at 23:28