3

What, precisely, 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?

  • 1
    install -d might not be POSIX, but don't quote me on that. – phk Jan 25 '17 at 23:13
  • 1
    At least in busybox by 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 of 0755 and 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
  • Does it trouble you that there might be more than one way of doing the same thing in UNIX/Linux? – mdpc Jan 26 '17 at 1:03
  • @mdpc, No, I just want to learn the difference, if any. Do they really do the exact same thing? – Alexander Jan 26 '17 at 1:23
5

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, install creates each directory and any missing parent directories. Parent directories are created with mode ‘u=rwx,go=rx’ (755), regardless of the -m option 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:

  1. For GNU install, the permissions of the parent directories could be different.
  2. install lets you set the ownership of the leaf directory.
  • 1
    Point 2 should be ownership. After all, mkdir has an -m option. – JdeBP Jan 26 '17 at 7:47
5

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 -d will call make_dir_parents with preserve_existing set to false
  • mkdir -p will call make_dir_parents with preserve_existing set to true.

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:

  • Your answer is backwards. The sources you linked show preserve_existing to be the other way around and I have confirmed that by trying it out. – Chewi Nov 21 '18 at 17:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.