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


回答:


339

それはほとんどできる..

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

31
:使用:エイリアス(「CLS」コマンド以下の例)として、それを作成するための alias cls="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}'"
danger89

6
Danger89から行をコピーして貼り付けたところ、奇妙なことに、出力が755ではなく%0..oで始まっていることがわかりました。他の誰かがこれに遭遇した場合、原因は0とoの間の非表示の文字のようです。削除すると、コマンドは適切に設定されます。乾杯!
ドナ

計算の問題があると思います。chmod 777 dirコマンドが許可を次のように出力した後767
Julian F. Weinert

Donnaが述べているように、0とoの間に面白い文字(または2)があり、また奇妙なことにSOが追加しているように見えます...
nbsp '17年

3
これはビットtとsを認識できません。ファイルのアクセス許可情報を取得するには、 'stat'コマンドを使用する必要があります。手で計算するとエラーになります!
Evan Langlois、2015年

148

私が考えることができる最も近い(それを十分に単純に保つ)は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

20
これはLinuxでstat -f '%A %N' *うまく機能します
。Mac

2
議論はそうでstatはないlsので、これは正しい答えではありません。しかし、これは望ましい出力のコンテキストでは正しい答えだと思います。awkがパイプで許可されている場合はfindstatが呼び出される場所で許可する必要があり-execます。その後、stat直接使用することができます*
javafueled

2
これははるかに短く、どのシステムでも100%機能します
Kangarooo

statを使用して権限を再帰的に表示する場合は、bashでを使用しますstat -c '%a %n' * **/*
Denis Chevalier

61

あなただけのGNU検索を使用することができます。

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

これは実際に覚えているコマンドです。役に立ち、効果的です。
2015年

5
これには-maxdepth 1オプションも必要です。それ以外の場合は、ディレクトリツリー全体を走査します。
ルスラン

36

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

stat -c "%a %n" *

また、特定の結果を取得するために、任意のfilenameまたはのdirectoryname代わりに使用できます*

Macでは、

stat -f '%A %N' *

1
私のために働いていませんでした。stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb

1
ubuntu 14.04で動作します。これを覚えておく必要がないように、.bashrcにエイリアスを追加しました:alias xxx = "stat -c '%a%n' *"
faeb187

1
参考になりました!Macのman of statにも表示されない%Aをどのように掘り下げるのですか?
igonejack 2018年

1
これは実際にはFreeBSDコマンドであり、Macはたまたまそれを上位カーネルとして使用して構築されています。
Mohd Abdul Mujib

man statmacOS 10.14.4に記載されている情報のみを使用する場合、コマンドはになりますstat -f "%Lp %N" *%Lpと同じものを印刷するように見えます%A
Cesar Andreu

17

@The MYYN

うわー、すてきなawk!しかし、suid、sgid、stickyビットはどうですか?

フィルターを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

3
+1ありがとうございます!私はそれを1行のエイリアスに短縮しました:alias "lsmod=ls -al|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;}'"
Jeroen Wiert Pluimers

+1はさらに作業ファイルのアクセス許可を復元するためのアイデアを取り入れました: ysgitdiary.blogspot.fi/2013/04/…–
Yordan Georgiev

5
lsmodをエイリアスとして使用しないでください。これは、カーネルMODをリストするための既知のposixコマンドです。
shadowbq 2014年

@JeroenWiertPluimersこれはawkからの構文エラーを示しています
Evan Langlois

@EvanLangloisなので、新しい質問をしてください。
Jeroen Wiert Pluimers、2015年

9

これを使用して、Unixの数値許可値(8進値)とファイル名を表示します。

stat -c '%a %n' *

これを使用して、Unixの数値許可値(8進数値)とフォルダーのsgidおよびスティッキービット、所有者のユーザー名、グループ名、合計サイズ(バイト単位)、およびファイル名を表示します。

stat -c '%a %A %U %G %s %n' *

ここに画像の説明を入力してください

%y人間が読める形式で最後の変更時刻が必要な場合は追加します。その他のオプションについては、statを参照してください

エイリアスを使用したより良いバージョン

エイリアスを使用すると、必要なことを実現するより効率的な方法で、色も含まれます。以下は、最初にグループディレクトリで整理された結果を表示し、カラーで表示し、人間が読める形式(1K 234M 2Gなど)で印刷サイズを表示します。編集~/.bashrcしてアカウントのエイリアスを追加するか、編集してグローバルに/etc/profile.d/custom.sh

入力clsすると、新しいLSコマンドの結果が表示されます。

alias cls="ls -lha --color=always -F --group-directories-first |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;}'"

エイリアスは最も効率的なソリューションです

フォルダツリー

bashrcまたはcustom.shを編集している間、次のエイリアスを含めて、入力lstreeすると現在のフォルダーツリー構造が表示されるグラフィック表現を表示します

alias lstree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'"

それは表示されます:

   |-scripts
   |--mod_cache_disk
   |--mod_cache_d
   |---logs
   |-run_win
   |-scripts.tar.gz

4

ファイルの権限情報を取得するためにlsを使用することはありません。statコマンドを使用します。必要な数値が表示されます。「Unix Way」は、ls(または 'echo *')とstatを使用して独自のスクリプトを作成し、必要な形式で情報を提供するために他に好きなものを作成する必要があることを示しています。


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