web-dev-qa-db-ja.com

`ls-l`出力のパーミッションを8進数に変換します

lsの出力を8進数の許可ビットに変換したいと思います。

私は、その演習を実装するための最短かつ最も明確な方法を考えています。入力として次のようになっているとしましょう。

total 1
drwxr----x 1 user2 workers 1024 May 26 22:22 dir
-rwx-wxrw- 2 user2 workers 1024 May 26 22:22 file.txt

出力は次のようになります。

741 dir
736 file.txt
5
user3527406

GNU find

find . -type f -printf "%m\t%f\n"

ファイルの完全なパスを取得するには、pの代わりにディレクティブfを使用します。

find . -type f -printf "%m\t%p\n"

結果を現在のディレクトリに制限するには、-maxdepthを指定します。

find . -maxdepth 1 -type f -printf "%m\t%f\n"

ファイルとディレクトリの両方の結果が必要な場合は、-type述語を削除します。

find . -printf "%m\t%p\n"
8
devnull

これにはlsを使用したくありません。 GNUシステムでは、次のものを使用できます。

stat -c'%a %n' *
7
Joseph R.

これは最も明確なコードではないかもしれませんが、出力からは非常に理解しやすいです。

echo drwxr----x | 
awk '{chars=substr($1,2); print chars; gsub("-","0",chars); 
gsub("r","4",chars); gsub("w","2",chars); gsub("x","1",chars); 
print chars; for(i=1;i<10;i++) { sum+=substr(chars,i,1); 
if (i%3 == 0) { printf "%d",sum;sum=0; }; } print ""; }'

rwxr----x
421400001
741

(ここでは、アクセス許可の最初の9ビットのみが設定されていると想定しています)

1
Hauke Laging