web-dev-qa-db-ja.com

Unixリストコマンド 'ls'は、数値のchmod権限を出力できますか?

ディレクトリをリストするときに、シンボリック出力-rw-rw-r--ではなく、644などの数値のUNIXパーミッションを表示することは可能ですか?

ありがとう。

167
Jon Winstanley

これを使用して、8進数値(数値のchmodパーミッション)とファイル名を表示します。

stat -c '%a %n' *

enter image description here

その他のオプションについては stat をご覧ください。

エイリアスを使用してこれを行うより効率的な方法については、以下のコメントを参照してください。

312
miku

あなたが探しているファイルを知っていると仮定すると、私が考えることができる最も近い(それを十分にシンプルに保つ)はstatです。そうでない場合、*はそれらのほとんどを見つけることができます:

/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...

スティッキー、suid、および企業をそのまま使用できます。

$ stat -c '%a %n' /tmp /usr/bin/Sudo
1777 /tmp
4755 /usr/bin/Sudo
138
JB.

単にGNU findを使用できます。

find . -printf "%m:%f\n"
55
ghostdog74

次のコマンドを使用できます

stat -c "%a %n" *

また、*の代わりにfilenameまたはdirectorynameを使用して、特定の結果を取得できます。

Macでは、次を使用できます

stat -f '%A %N' *
29

@The MYYN

すごい、ニースawk!しかし、suid、sgid、sticky bitはどうでしょうか?

Sとtでフィルターを拡張する必要があります。そうしないと、カウントされず、間違った結果が得られます。この特別なフラグの8進数を計算するための手順は同じですが、インデックスは4 7と10です。実行ビットが設定されたファイルの可能なフラグは---s--s--t実行ビットが設定されていないファイルのAMDは---S--S--Tです。

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

テスト用:

touch blah
chmod 7444 blah

結果は次のとおりです。

7444 -r-Sr-Sr-T 1 cheko cheko   0 2009-12-05 01:03 blah

そして

touch blah
chmod 7555 blah

あげる:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah
16
user224243

ファイルの許可情報を取得するためにlsを使用しません。 statコマンドを使用します。必要な数値が表示されます。 「Unix Way」では、ls(または「echo *」)とstatを使用して独自のスクリプトを作成する必要があると書かれています。

4
Evan Langlois

いいえ、数値のuid/guidのみを印刷できます。

2
dusoft

tl; dr:質問に対する簡単な答えは、lsは数値の許可を出力できないことです。statを使用します。

Awkをいじくり回すと、拡張された許可が翻訳で失われます。

例えば:

$ ls -la /usr/local/src/
total 8
drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

提案されたソリューションはこれを印刷します:

$ ls -la /usr/local/src | awk '{>
total 8
765 drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
765 drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

これはまったく間違っています。

一方、statはそれを正しくします。

$ stat/usr/local/srcファイル:/ usr/local/srcサイズ:4096ブロック:8 IOブロック:4096ディレクトリデバイス:801h/2049d iノード:917803リンク:2アクセス:(2775/drwxrwsr -x)Uid:(0/root)Gid:(50/staff)アクセス:2018-10-24 12:30:58.197907324 +0900変更:2018-10-23 11:18:59.810677000 +0900変更:2018-10 -23 11:18:59.810677000 +0900出生:-

Man statからのボーナス:

$ stat -c %a /usr/local/src
2775

これはDebian安定版でテストされています。

0
Steve Clement

選択した回答エイリアスを使用する提案 を基に構築し、ディレクトリをリストに渡すことができるように関数に変換しました。

# ls, with chmod-like permissions and more.
# @param $1 The directory to ls
function lls {
  LLS_PATH=$1

  ls -AHl $LLS_PATH | 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}"
}
0