How can I get binary file permissions from command line?

By using stat -c "%a %n" * I'm getting file permissions in octal mode (such as 755), Is there any way to see the file permissions in binary mode (such as 111 101 101)?

4 Answers

For a single file:

stat -c "%a" filename.txt | xargs -I PERM echo "obase=2; ibase=8; PERM" | bc

And as a more clear script for more that of one file:

#!/bin/bash
for file in *
do perm=$(stat -c "%a" "$file") bin=$(echo "obase=2; ibase=8; $perm" | bc) echo "$bin $file"
done

the output:

110110100 baz
110110100 foo
110110101 bar

Notes

  • First we loop into all files and directories using for file in *.
  • With stat -c "%a we gather the file permission in octal, then
  • Using echo we add other necessary details to permission and pip it to bc.
  • Finally bc does the conversion and then we printout the result and file name.
  • obase=2; means output should be in binary, ibase=8 means our input is in octal and $perm is the file permission in octal like 664.
0

You can do this using the perl stat module e.g. given

$ stat -c '%a %n' *
600 other file
775 somedir
664 somefile

then

$ perl -MFile::stat -e 'printf "%b %s\n", (stat $_)->[2] & 07777, $_ for @ARGV' *
110000000 other file
111111101 somedir
110110100 somefile

If you just want to visualize file permissions in binary, you could use the first column of ls -l:

$ ls -ld /bin
drwxr-xr-x 2 root root 4096 mai 18 05:38 /bin

Here you can see that rwxr-xr-x corresponds to 111101101

Python

$ python -c 'import sys,os;[ sys.stdout.write( " ".join([bin(os.stat( i ).st_mode)[-9:],i,"\n"]) ) for i in sys.argv[1:] ]' /etc/passwd
110100100 /etc/passwd 

The job is done via os.stat() function, which returns a tuple of file attributes, among which isst_mode in decimal format. We then convert it to binary, and extract last 9 digits.

Everything is performed within list comprehension to operate on all files given on command-line (so you can provide multiple files or use globstar).

As a script

#!/usr/bin/env python2
import sys, os
for filename in sys.argv[1:]: perms = os.stat(filename).st_mode print bin(perms)[-9:], filename
5

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

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

You Might Also Like