コマンドラインから8進数のファイル許可を取得するにはどうすればよいですか?


373

ファイルのアクセス許可を設定するchmodコマンドがありますが、コマンドラインから8進モード(755など)でファイルのアクセス許可を取得できますか?


2
誤ってこのページにアクセスしたが、実際にMacでこれを行う方法を探していた私のような人々の場合:stackoverflow.com/a/14855227/470749
Ryan

2
stat --format "%A" $FILE人間が読めるdrwxr-x---形式を提供します。役に立つかもしれないしそうでないかもしれません。
トレバーボイドスミス

回答:


535

あなたが試すことができます

stat -c "%a %n" *

*調査する関連ディレクトリまたは正確なファイル名に置き換えます。

statmanページから、

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

使用法:

  • ファイルあり:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • フォルダーあり:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(参照)


57
Mac OSでは、使用stat -f '%A %a %N' *(クレジット:geeklog.adamwilson.info/article/58/…
s2t2

1
より快適な場合lsfor f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends

2
@usandfriendsの出力をループするのlsは悪い考えです。本当にループを使用したい場合は、できることfor f in *; do stat "%a %n" "$f"; done
トムフェネク

1
なぜMac OSではすべてがわずかに変更されますか(Unix ISOユーティリティでも)?これには実際の理由がありますか?
ヴァシリス

2
@hackel、あなたが本当に感じていることを教えてください。笑!
-MikeSchinkel

44

Linuxのファイル許可は、Linux statコマンドを使用して8進数形式で表示できます。

キーボードのCtrl+ Alt+ Tを押して、ターミナルを開きます。開いたら、8進モードでファイルのアクセス許可を検索するディレクトリに移動します。

stat -c '%A %a %n' *

%A人間が読める形式のアクセス権

%a 8進数のアクセス権

%nファイル名

8進数とアクセス許可

8進数を使用してモード/許可を表すことができます。

r: 4
w: 2
x: 1

たとえば、ファイル所有者の場合、次のように8進数モードを使用できます。8進数のファイルの読み取り、書き込み、および実行(完全)許可は0 + r + w + x = 0 + 4 + 2 + 1 = 7

8進数のファイルに対する読み取りおよび書き込み権限のみが0 + r + w + x = 0 + 4 + 2 + 0 = 6です

8進数のファイルの読み取りおよび実行権限のみが0 + r + w + x = 0 + 4 + 0 + 1 = 5です

上記の方法を使用して、グループおよびその他の権限を計算します。所有者に完全な許可を与え、グループに読み取りと実行の許可を与え、他の人に読み取り専用の許可を与えたい場合、次のように許可を計算する必要があります:User = r + w + x = 0 + 4 + 2 + 1 = 7グループ= r + w + x = 0 + 4 + 2 + 0 = 6その他= r + w + x = 0 + 0 + 0 + 1 = 1

有効な許可は761です。

出典:http : //kmaiti.blogspot.com/2011/09/umask-concept.html


2
最初の0はあまりにも特殊なビットを表す:pastebin.com/6ymkFt71
Braiam

36

AgileAdam.comのAdam Courtemancheによる「ls」を使用した「755」スタイルのアクセス許可で詳しく説明されているように、出力1のように機能するがわずかに処理してエイリアスも8進数で表示するエイリアスを作成できます。これにより、3桁の2オクタル許可を示す先頭の列が追加されます。書かれているように、これはほとんどのファイルとディレクトリで機能しますが、スティッキーまたはsetuid / setgidビットが設定されている場合は正しく機能しません。3 lsols -l

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

ただし、techtonikが 指摘しているように、これには深刻な欠点があります。あなたは、引数を渡すことはできませんこれにlsoあなたが同じようにエイリアスコマンドそれらが追加の引数として取られているので、代わりに。したがって、あなたは実行することはできません特定のファイルやディレクトリに、またあなたは、任意のオプション(のように渡すことができ、またはをします)。lsawklso-F--colorlso


修正方法は、エイリアスではなく関数lso として定義することです。

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

これをシェルで対話的に試す場合は、実行unalias lsoしてエイリアスを削除します。関数を定義する前または定義した後にエイリアスを削除できます。のように~/.bashrc、ソースとなるファイルに配置する場合は、alias行を取り出して関数定義を追加してください。

なぜこれが機能するのですか?エイリアスとは異なり、bashシェル関数は位置パラメーター、つまりコマンドライン引数を取ることができます"$@"は完全な引数リストに展開され、lso関数の引数がに渡されlsます。(エイリアス定義とは異なり、関数本体は引用符で囲まれていません。したがって、およびの\前の文字を削除する必要が$ありました"。)

lsoこの方法で関数として定義された場合にオプションを渡すことができるため、定義から-a-Gオプションを削除したい場合があります。必要な場合は手動で渡すことができます。(オプションは、ファイルのアクセス権などの詳細情報が表示されるために必要とされるすべてで、それを削除する利点はありません。)-l

lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

エイリアスとして定義する際の制限指摘してくれたtechtonikに感謝します。そのため、代わりに機能にすることについての資料でこの投稿を拡大したい思います。lso


1これは、からの出力を解析しないという一般的なルールlsを無視しいるように見えるかもしれませんls人間が判読できる出力を生成します。これにより、特異性と制限が導入され、一般に他のコマンドの入力としては不適切になります。この場合、我々は解析ls以来、私たちはの正確な動作を保持したいls私たちを除いて1つのを追加変更。

2下に示す関数バージョンにも適用され、バグと見なされる可能性があるこのエイリアスの1つの制限は、4番目の8進数がゼロの場合でも 3桁の8進数のみを表示することです。以下のようjfmercerがいる正しく指摘し、ここで表示される8進数字は、スティッキービット存在する場合、またsetuidまたはsetgidのビットを反映するものではありません。

3もっと真剣に単に第8進数が表示されないよりも、この方法では、ということであると仮定し、彼らが設定されていない、とあなたが見たら-彼らはしている場合tsあるいはS許可列に-そして、あなたは8進数を無視すべきです。これは、スティッキーsetuid / setgidビットを考慮しない方法でアクセス許可文字列からビットが推測されるためです。


ディレクトリでは動作しません-awk: read error (Is a directory)
アナトリーtechtonik

@techtonikこれを指摘してくれてありがとう!私は(最終的に)この回答を更新して、その修正を含めました。
エリアケイガン

1
--colorショーの色のパラメーターを追加できますlso() { ls -alG "$@" --color | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
-tagplus5

1
これを投稿してから、スティッキーsetuid / setgidの問題の解決策を見つけましたか?
シルベスト

21

以前の「統計」関連の回答を拡張/簡略化するだけです:

以下を実行するだけです:

stat <path_to_file>

出力には、他の情報とともに8進数の許可が含まれます。



詳細(統計バージョンと例):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

以下に注意してください:(0644 / -rw-r--r--)


6

移植性のために、次を使用できますperl

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

エラーが発生したときに通知する場合は、次を試してください。

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt

2
ポータブルであることに加えて、@ cuonglmのソリューションは3文字ではなく4文字の8進文字を表示するため、しばしば忘れられる「スティッキービット」の状態を示します。
jfmercer

2

あなたは使うことができfind-printf、アクション。

ls8進数のアクセス許可は表示されませんが、このfindベースの回避策を使用できます。

find path -printf "%m:%f\n"

たとえば、ビデオディレクトリを確認するには:

$ find Videos -printf "%m:%f\n"
755:Videos

%m書式指定子は伝え-printfながら、オクタル許可を印刷するためのアクションを%f書式指定子が、それはファイル名を印刷させます。

複数のファイル名をに渡すことができますfind。グロブ(例:)を使用することもできfind * -printf "%m:%f\n"ます。

-nameまたはのようなテストを使用する必要はありません-iname。興味のあるファイルまたはディレクトリの名前を開始点として渡すだけで十分ですfind。つまり、find上記のように、単語の直後に引数として名前を指定します。

find出力の表示方法を細かく制御できます。特に役立つと思われる2つの変更点があります。

  • デフォルトではfind、と同様にサブディレクトリを再帰しls -Rます。find渡す開始点のサブディレクトリにアクセスしたくない場合は、追加する-maxdepth 0-maxdepth、他の値と一緒に使用して、深さを指定できます。

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fファイル名のみを表示するためfind、ファイルを取得するために再帰する必要がある場合、ファイルの場所がわからない場合があります。ファイルが見つかった開始点から始まるパスを表示するには、%p代わりに使用します。

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

コマンドのman find使用に関する詳細については、を参照してくださいfind

別の方法(lsおよびawk

これを使用して、すべてのディレクトリファイルとそのア​​クセス許可を一覧表示できます。

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

これは本質的に、Adam Courtemancheのlsoエイリアスと同じコマンドであり、その答えは引用されており、単一のコマンドとして実行されます。これを一度しか使用しない場合、またはまれにしか使用しない場合、エイリアスまたはシェル関数としてわざわざ書きたくない場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.