How to create a directory and give permission in single command in Linux?
I have to create lots of folder with full permission 777
.
install -d -m 0777 /your/dir
should give you what you want. Be aware that every user has the right to write add and delete files in that directory.
You could write a simple shell script, for example:
#!/bin/bash
mkdir "$1"
chmod 777 "$1"
Once saved, and the executable flag enabled, you could run it instead of mkdir and chmod:
./scriptname path/foldername
However, alex's answer is much better because it spawns one process instead of three. I didn't know about the -m
option.
Just to expand on and improve some the above answers:
First, I'll check the mkdir man page for GNU Coreutils 8.26 -- it gives us this information about the option '-m' and '-p' (can also be given as --mode=MODE and --parents, respectively):
...set[s] file mode (as in chmod), not a=rwx - umask
...no error if existing, make parent directories as needed
The statements are vague and unclear in my opinion. But basically, it says that you can make the directory with permissions specified by "chmod numeric notation" (octals) or you can go "the other way" and use a/your umask.
Side note: I say "the other way" since the umask value is actually exactly what it sounds like -- a mask, hiding/removing permissions rather than "granting" them as with chmod's numeric octal notation.
You can execute the shell-builtin command umask
to see what your 3-digit umask is; for me, it's 022
. This means that when I execute mkdir yodirectory
in a given folder (say, mahome) and stat
it, I'll get some output resembling this:
755 richard:richard /mahome/yodirectory
# permissions user:group what I just made (yodirectory),
# (owner,group,others--in that order) where I made it (i.e. in mahome)
#
Now, to add just a tiny bit more about those octal permissions. When you make a directory, "your system" take your default directory perms' [which applies for new directories (its value should 777)] and slaps on yo(u)mask, effectively hiding some of those perms'. My umask is 022--now if we "subtract" 022 from 777 (technically subtracting is an oversimplication and not always correct - we are actually turning off perms or masking them)...we get 755 as stated (or "statted") earlier.
We can omit the '0' in front of the 3-digit octals (so they don't have to be 4 digit) since in our case we didn't want (or rather didn't mention) any stickybits, setuids or setgids (you might want to look into those, btw, they might be useful since you are going 777). So in other words, 0777 implies (or is equivalent to) 777 (but 777 isn't necessarily equivalent to 0777--since 777 only specifies the permissions, not the setuids, setgids, etc.)
Now, to apply this to your question in a broader sense--you have (already) got a few options. All the answers above work (at least according to my coreutils). But you may (or are pretty likely to) run into problems with the above solutions when you want to create subdirectories (nested directories) with 777 permissions all at once. Specifically, if I do the following in mahome with a umask of 022:
mkdir -m 777 -p yodirectory/yostuff/mastuffinyostuff
# OR (you can swap 777 for 0777 if you so desire, outcome will be the same)
install -d -m 777 -p yodirectory/yostuff/mastuffinyostuff
I will get perms 755
for both yodirectory
and yostuff
, with only 777
perms for mastuffinyostuff
. So it appears that the umask
is all that's slapped on yodirectory
and yostuff
...to get around this we can use a subshell:
( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )
and that's it. 777 perms for yostuff, mastuffinyostuff, and yodirectory.
IMO, it's better to use the install
command in such situations. I was trying to make systemd-journald
persistent across reboots.
install -d -g systemd-journal -m 2755 -v /var/log/journal
According to mkdir's man page...
mkdir -m 777 dirname
When the directory already exist:
mkdir -m 777 /path/to/your/dir
When the directory does not exist and you want to create the parent directories:
mkdir -m 777 -p /parent/dirs/to/create/your/dir