web-dev-qa-db-ja.com

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

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

369
Anwar

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

stat -c "%a %n" *

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

statのmanページ から、

-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/
    

(参照)

528
jokerdino

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

43
Mitch

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

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}'"

ただし、これには深刻な欠点があります techtonikpoints out引数を渡すことはできません このlsoエイリアスに lsコマンド と同じように、 代わりにawk 。したがって、特定のファイルまたはディレクトリでlsoを実行したり、lsoにオプション(-F--colorなど)を渡すことはできません。


修正は、エイリアスではなくlsofunction として定義することです。

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に渡されます。 (エイリアス定義とは異なり、関数本体は引用符で囲まれません。したがって、\および$の前に"charactersを削除する必要がありました。)

この方法で関数として定義すると、オプションをlsoに渡すことができるため、定義から-aおよび-Gオプションを削除することができます。あなたはそれらが欲しい。 ( -lオプションは、ファイル許可などの詳細を表示するために必要ですat 。したがって、削除するメリットはありません。)

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 for 制限を指摘 エイリアスとしてlsoを定義するため、代わりにそれを機能にすることについての資料でこの投稿を拡大するように私を動機付けました。


1これは軽視されているように見えるかもしれません lsからの出力を解析しないことに関する一般的な規則lsは、非常に人間が読み取れる出力を生成します。これにより、特異性と制限が導入され、一般に他のコマンドの入力としては不適切になります。 この場合lsを解析します。なぜなら、私たちはlsの正確な動作を保持したいからです。 one変更を追加しました。

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

3単に4番目の8進数を表示しないことよりももっと深刻なのは、このメソッドはが設定されていないことを想定していることです、設定されていない場合は許可文字列のts、またはS--その後、8進数を無視する必要があります。これは、スティッキーsetuid/setgidビットを考慮しない方法でビットが許可文字列から推測されるためです。

35
Eliah Kagan

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

単に実行できます:

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--)

21
Vano

移植性のために、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
6
cuonglm

find-printfアクションで使用できます。

lsは8進数の許可を表示しませんが、このfindベースの回避策を使用できます。

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

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

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

%m形式指定子は、-printfアクションに8進数の許可を出力するように指示しますが、%f形式指定子はファイル名を出力します。

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

-name-inameのようなテストを使用する必要はありません。 findへの開始点として、興味のあるファイルまたはディレクトリの名前を渡すだけで十分です。つまり、上記に示すように、Word 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
    ....

findコマンドの使用の詳細については、 man 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エイリアス と同じコマンドであり、 その答え が引用されており、単一のコマンドとして実行されます。これを一度しか使用しない場合、またはまれにしか使用しない場合は、エイリアスまたはシェル関数としてわざわざ書きたくない場合があります。

2
Maythux