web-dev-qa-db-ja.com

ls -l数値フォーマットはありますか?

このls -lコマンドの出力を検討してください。

$ ls -l /usr/bin | tail
-rwxr-xr-x 1 root root     105696 Oct 25  2014 zenity
-rwxr-xr-x 1 root root     188296 Oct 21  2013 Zip
-rwxr-xr-x 1 root root      86096 Oct 21  2013 zipcloak
-rwxr-xr-x 1 root root      48459 Mar  3  2015 zipdetails
-rwxr-xr-x 1 root root       2953 Oct 29 10:45 zipgrep
-rwxr-xr-x 2 root root     166584 Oct 29 10:45 zipinfo

許可は、人間が読める素敵な文字でリストされています。 lsを取得して、それらのアクセス許可に相当する数値を出力する方法はありますか?

6
j0h

lsにはそのようなフラグはありませんが、statコマンドでは8進数の許可を表示できます。テストファイルのサンプル出力を検討します。

testdir:$ stat TESTER
  File: ‘TESTER’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d  Inode: 1197        Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ xieerqi)   Gid: ( 1000/ xieerqi)
Access: 2015-11-05 17:42:01.914917433 -0700
Modify: 2015-11-05 17:42:01.914917433 -0700
Change: 2015-11-05 18:41:04.463776180 -0700
 Birth: -

statには--formatフラグもあり、これによりls -lを「シミュレート」できます。

testdir:$ stat --format="%a %h %U %G %s %y %n" * | head -n 3                   
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.918917452 -0700 Aaaaaaa.bbb - 0000003 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.922917471 -0700 Aaaaaaa.bbb - 0000004 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.930917509 -0700 Aaaaaaa.bbb - 0000005 tag tag_tag 9tag

ここでの唯一の制限は時間形式を変更できないことです、そして、カラー出力を追加できません。

.bashrc内のそのコマンドのエイリアスを、より短いコマンド、たとえばalias lsl2='stat --format="%a %h %U %G %s %y %n" *'

または、findawkを使用してより適切な書式設定を行う小さな関数を作成しました

 function lsl2
   {
     find . -maxdepth 1 | sort |  xargs -I{} stat --format="%a %h %U %G %s %y %n" {}  | awk '{$7=substr($7,1,5);$8    =" ";print}'
  }

サンプル出力

testdir:$ lsl2 | head -n 7
775 3 xieerqi xieerqi 4096 2015-11-05 22:20   .
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000003 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000004 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000005 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000006 tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000006 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42   ./Aaaaaaa.bbb - 0000007 tag 9tag

testdir:$ type lsl2
lsl2 is a function
9

https://stackoverflow.com/questions/1795976/can-the-unix-list-command-ls-output-numerical-chmod-permissions によると不可能です。

しかし、その質問に対する答えは、それを「ほぼ」達成する方法を提案します。

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

エイリアスを簡単に使用できるようにすることもできますが、lsだけではできません。

4
Tobias

GNUを見てください:

find -printf "%y %m %n %u %g %Ac %f\n" -maxdepth 1

参照:man find

1
Cyrus

これが楽しいパイプラインです

paste <(printf "%04d\n" $(stat -c '%a' *)) <(ls -l | sed 1d) | 
  sed -r 's/([[:digit:]]+)\t(.)........./\2\1/' 
  • printf "%04d\n" $(stat -c '%a' *)-各ファイルのゼロが埋め込まれた8進数のアクセス権を出力します
  • ls -l | sed 1d-長いリストから、最初の行「total 12345」を引いたもの
  • paste <(...) <(...)-各プロセス置換から1行を取得し、タブでそれらを結合します
  • sed -r 's/([[:digit:]]+)\t(.)........./\2\1/'-rwxrwxrwx人間が読めるパーミッションを8進数値に置き換えます。
1
glenn jackman