文字列で許可番号を取得する方法:-rw-r--r--


53

同じchmodを設定する必要があります。-rw-r--r--の番号を取得する方法は?


2
プログラムで、または翻訳する方法を知っている必要がありますか?
mattdm

私は翻訳するのが面倒です:) statはちょっとの間は大丈夫です。
CND

9
「同じ設定」とはどういう意味ですか?-rw-r--r--パーミッションを持つファイルがすでにあり、同じパーミッションを持つ別のファイルを設定したいですか?次に、chmodサポートの--reference有無を確認します。「-reference = RFILEは、MODE値の代わりにRFILEのモードを使用します」-man chmod。
マナトワーク


どのUnixを使用していますか?
クサラナナンダ

回答:


53

stat出力を確認してください:

# stat .xsession-errors 
  File: ‘.xsession-errors’
  Size: 839123          Blocks: 1648       IO Block: 4096   regular file
Device: 816h/2070d      Inode: 3539028     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/     lik)   Gid: ( 1000/     lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
 Birth: -

11
stat -c %a /path/to/file必要な手品です。
fromnaboo

答えは上のアクセスブロックにあります。この例で使用したファイルには、問題のファイルとは異なるアクセスセットがあります。質問の1つはアクセスを示しているはずです:(0644 / -rw-r--r--)
nycynik 14

65
r=4
w=2
x=1

すべてのグループで。あなたの例は6(r + w =​​ 4 + 2)4(r = 4)4(r = 4)です。


26

完全な許可モード番号は4桁の8進数ですが、ほとんどの場合、下位3桁のみを使用します。r = 4、w = 2、x = 1を使用して、権限文字列に各グループを追加します。例えば:

 421421421
-rwxr-xr--
 \_/        -- r+w+x = 4+2+1 = 7
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+_ = 4+0+0 = 4     => 0754

これで、次のような奇妙なモード文字列が表示される場合があります。

-rwsr-xr-T

4番目の数字はx、モード文字列のビットにオーバーロードされます。xそこ以外の文字が表示される場合、これらの「特別な」4桁のビットの1つが設定されていることを意味し、文字が小文字の場合、xその位置にも設定されます。したがって、これの翻訳は次のとおりです。

   4  2  1
 421421421
-rwsr-xr-T
   +  +  +  -- s+_+T = 4+0+1 = 5  
 \_/        -- r+w+s = 4+2+1 = 7  (s is lowercase, so 1)
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+T = 4+0+0 = 4  (T is uppercase, so 0)   => 05754

数値が8進数であることを示すUNIXの標準的な方法は、ゼロで開始することです。GNU chmodは、与えられているモードはとにかく8進数であると想定しますが、ゼロを追加するのが最も安全です。

最後+に、モード文字列の最後にが表示された場合:

-rwxr-xr-x+

それは、ファイルが拡張された許可を持っていることを意味し、あなたは以上のものを必要としますchmod。まずsetfaclgetfaclコマンドとコマンドを調べてください。



3

許可は、2進数の文字列表現です。主に表され、残りは文字があります。
0-

基本的な

基本的な許可の場合:

すべての変換-やキャップSTにし0、残りは表すべきです1
そのように構築された結果の2進数は、8進数として印刷する必要があります。

$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644

1行で:

$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644

エラー修正と他の3ビットの検出10002000または4000さらにコードが必要:

#!/bin/bash

Say     (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }

e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"

a=$1

((${#a}>10))  &&   SayError 1 "$e1"
((${#a}==10)) && { Say        "$e2"; a=${a#?}; }
((${#a}<9))   &&   SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9))   &&   SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4)) 
[[ $a =~    [sS]...$ ]] && c=$((c|2)) 
[[ $a =~       [tT]$ ]] && c=$((c|1))

printf '%04o\n' "$((2#$b|c<<9))"

0

文字列と16進数のアクセス許可値を持つファイルのリストを取得します。出力をExcelに簡単に入力できるように、最後に%Nを追加します。

stat -c "%A %a %N" *

-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'

これにより、特定の16進アクセス許可を持つすべてのファイルが検索されます。

find /tmp1 -user root -perm 644

-2

Dir内のすべての同時ファイル

-bash-4.1$ chmod -R 640 *

すべてのファイル

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