同じchmodを設定する必要があります-rw-r--r-の数値を取得する方法は?
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: -
r=4
w=2
x=1
すべてのグループで。あなたの例は6(r + w = 4 + 2)4(r = 4)4(r = 4)です。
完全な権限モード番号は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
以上が必要になります。まず、setfacl
コマンドとgetfacl
コマンドを調べてください。
これは簡単かもしれません
-bash-3.2$ stat --format=%a sample_file
755
アクセス許可は、2進数の単なる文字列表現です。0
の大部分は-
で表され、残りは文字です。
基本的な権限の場合:
すべての-
と大文字のS
またはT
を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ビット1000
、2000
または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))"
文字列と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