How to inspect group permissions of a file
Method #1 - stat
You could use the stat
command to get the permissions bits. stat
is available on most Unixes (OSX, BSD, not AIX from what I can find). This should work on most Unixes, except OSX & BSD from what I can find.
$ stat -c "%a" <file>
Example
$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct 6 14:16 afile.txt
Use this command:
$ stat -c "%a" afile.txt
664
And use a simple grep
to see if the groups permissions mode is a 6 or 7.
$ stat -c "%a" afile.txt | grep ".[67]."
For OSX and BSD you'd need to use this form of stat
, stat -f
(or perhaps stat -x
), and parse accordingly. Since the options to stat
are different you could wrap this command in an lsb_release -a
command and call the appropriate version based on the OS. Not ideal but workable. Realize that lsb_release
is only available for Linux distros so another alternative would need to be devised for testing other Unix OSes.
Method #2 - find
I think this command might serve you better though. I makes use of find
and the printf
switch.
Example
$ find a -prune -printf '%m\n'
664
Method #3 - Perl
Perl might be a more portable way to do this depending on the OSes you're trying to cover.
$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664
NOTE: The above makes use of Perl's stat()
function to query the filesystem bits.
You can make this more compact by forgoing using an array, @pv
, and dealing with the output of stat()
directly:
$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664
I ended up ls
-parsing:
is_group_writable() {
local ls="$(ls -ld "$1")"
[ "${ls:5:1}" = "w" ]
}
I'm grateful for @slm's extensive answer, but none of the other methods are as straightforward. The stat
method would require me to write at least two different invocations to cover OS X, and even after that it returns the octal representation which I still have to apply arithmetic to. The Perl method is OK but requires me to start an interpreter for such a simple task, and I would like to keep it simple and using only posix utils.