web-dev-qa-db-ja.com

どうすればlsでアクセス許可の8進数表記を表示できますか?8進数はすべてのアクセス許可を表すことができますか?

システムでmanlsページを見て、Googleを検索すると、そこに表示されます8進のアクセス許可を表示するためにawkまたはPerlを使用する方法のハックですlsを使用する場合、bashを使用すると、さらにネイティブなものがありますか?

Ls -alhの標準出力

$ ll
total 0
drwxr-xr-x   5 user  group   170B May 20 20:03 .
drwxr-xr-x  17 user  group   578B May 20 20:03 ..
-rw-r--r--   1 user  group     0B May 20 20:03 example
-rw-r--r--   1 user  group     0B May 20 20:03 example-1
-rw-r--r--   1 user  group     0B May 20 20:03 example-3

パーミッションの8進数表現を含む望ましい出力

$ ll
total 0
drwxr-xr-x 1775  5 user  group   170B May 20 20:03 .
drwxr-xr-x 1775 17 user  group   578B May 20 20:03 ..
-rw-r--r-- 1644  1 user  group     0B May 20 20:03 example
-rw-r--r-- 1644  1 user  group     0B May 20 20:03 example-1
-rw-r--r-- 1644  1 user  group     0B May 20 20:03 example-3

(免責事項:これらの8進数が正確に正しいかどうか不明)

推論

パーミッションのdrwxr-xr-x表記の方が慣れていますが、ダッシュが奇妙な場所にある場合、一目で誤って読むことがあります。 8進数の値も確認してください。

変換能力(質問パート2)

昔は8進数のアクセス許可が000-777に制限されていたと思いますが、最近はset-group-IDstickyのように、1775のような4桁の8進数を提供するものがあります。すべての可能な権限を8進形式で表すことは可能ですか?そうでない場合は、bashのlsコマンドがこの形式になっていないように見える理由をよく理解します。

14
cwd

また、statを使用してlsのような出力を取得しますが、出力をフォーマットするために別のアプローチを使用します。TABを区切り文字として使用し(必要に応じて後で簡単に解析できるようにする)、statを介して時間をフォーマットし、最後に numfmt (GNUに含まれる coreutils> = 8.212013-02-14)ニースファイルサイズを取得するには:

stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" * | numfmt --to=iec-i --field=6 --delimiter='     ' --suffix=B

numfmtに使用される区切り文字も Tab (端子ヒットに入力するには Ctrl+V その後 Tab)。
これは、出力は次のようになります。

drwxr-xr-x  755 2   don users   4.0KiB  2013-05-17 03:37:02 150905-adwaita-x-dark-light-1.3
drwxr-xr-x  755 8   don users   4.0KiB  2011-10-13 07:30:39 Adwaita Slim
drwxr-xr-x  755 3   don users   4.0KiB  2013-05-17 19:26:41 Away
drwxr-xr-x  755 5   don users   4.0KiB  2013-05-17 03:09:14 elementary
-rw-r--r--  644 1   don users   539KiB  2013-05-10 00:32:14 gdm.jpg
-rw-r--r--  644 1   don users   1.5MiB  2013-05-19 04:30:16 gnome-Shell-3.8.2.tar.xz
drwxrwxr-x  775 4   don users   4.0KiB  2013-05-18 18:34:38 gnome-themes-standard-3.8.1
-rw-r--r--  644 1   don users   3.7MiB  2013-05-18 18:30:06 gnome-themes-standard-3.8.1.tar.xz
drwxrwxr-x  775 17  don users   4.0KiB  2013-05-18 18:37:05 gtk+-3.8.2
-rw-r--r--  644 1   don users   14MiB   2013-05-18 18:30:56 gtk+-3.8.2.tar.xz
drwxr-xr-x  755 13  don users   4.0KiB  2013-05-18 02:41:51 MediterraneanNight-2.02
-rw-r--r--  644 1   don users   603B    2013-05-19 20:07:26 python-pytaglib.tar.gz
-rw-r--r--  644 1   don users   442KiB  2013-05-19 00:33:27 Stripes.jpg

cwdのコメント通り、OSXでは、coreutilsコマンドはgstatgnumfmtです。

6
don_crissti

statコマンドを使用して、おおまかに必要なものを取得できます。

$ stat -c '%A %a %h %U %G %s %y %n' *
drwxrwxr-x 775 2 saml saml 4096 2013-05-16 22:02:13.230463837 -0400 alsa
drwxrwxr-x 775 31 saml saml 4096 2013-03-26 12:09:20.707827127 -0400 apps
-rw-rw-r-- 664 1 saml saml 43627 2013-05-18 12:28:32.157583577 -0400 autosave.h2song
-rw-rw-r-- 664 1 saml saml 3283 2013-05-18 02:49:41.565154101 -0400 bbbb
drwxrwxr-x 775 4 saml saml 4096 2013-05-03 06:56:50.087842384 -0400 bin
-rw-rw-r-- 664 1 saml saml 4403 2013-05-18 19:20:05.819681196 -0400 blahblah

必要に応じて、クリーンアップしたバージョンを以下に示します。

$ stat -c '%A %a %h %U %G %s %y %n' *| sed 's/\.[[:digit:]]\+[ ]\+-[[:digit:]]\+/ /'
drwxrwxr-x 775 2 saml saml 4096 2013-05-16 22:02:13  alsa
drwxrwxr-x 775 31 saml saml 4096 2013-03-26 12:09:20  apps
-rw-rw-r-- 664 1 saml saml 43627 2013-05-18 12:28:32  autosave.h2song
-rw-rw-r-- 664 1 saml saml 3283 2013-05-18 02:49:41  bbbb
drwxrwxr-x 775 4 saml saml 4096 2013-05-03 06:56:50  bin
-rw-rw-r-- 664 1 saml saml 4403 2013-05-18 19:20:05  blahblah

上記の演算子に加えて使用できるその他の形式演算子については、statのマニュアルページをご覧ください。

参考文献

13
slm

このawkコードは、権利を記号から数字に変換します。ただし、通常のケースのみを対象とします(つまり、少なくともsStTは対象外です)。

awk '$1 ~ /^[-dsbclp]([-r][-w][-x]){3}[.+]?$/ 
  {for(i=0;i<3;i++) {symbol=substr($1,2+i*3,3); sum=0; 
    if (substr(symbol,1,1) == "r") sum+=4;
    if (substr(symbol,2,1) == "w") sum+=2;
    if (substr(symbol,3,1) == "x") sum+=1;
    printf "%d",sum;}}'

そして、これはあなたが望む出力を生成します:

awk '$1 ~ /^[-dsbclp]([-r][-w][-x]){3}[.+]?$/ 
  {printf "%s ",$1; 
    for(i=0;i<3;i++) {symbol=substr($1,2+i*3,3); sum=0; 
      if (substr(symbol,1,1) == "r") sum+=4;
      if (substr(symbol,2,1) == "w") sum+=2;
      if (substr(symbol,3,1) == "x") sum+=1;
      printf "%d",sum;}
    $1=""; print}'
1
Hauke Laging