ファイル許可を設定するchmodコマンドがありますが、コマンドラインから8進モード(755など)でファイル許可を取得できますか?
あなたが試すことができます
stat -c "%a %n" *
*
を、調べるディレクトリまたは関連する正確なファイル名に置き換えます。
statのmanページ から、
-c --format=FORMAT
use the specified FORMAT instead of the default; output a newline after
each use of FORMAT
%a Access rights in octal
%n File name
使用法:
ファイルあり:
$ stat -c "%a %n" ./Documents/Udev.html
664 ./Documents/Udev.html
フォルダーあり:
$ stat -c "%a %n" ./Documents/
755 ./Documents/
Linuxのファイル許可は、Linux statコマンドを使用して8進数形式で表示できます。
押すだけ Ctrl+Alt+T キーボードでターミナルを開きます。開いたら、8進モードでファイルのアクセス許可を検索するディレクトリに移動します。
stat -c '%A %a %n' *
%A人間が読める形式のアクセス権
%a 8進数のアクセス権
%nファイル名
8進数とアクセス許可
8進数を使用してモード/許可を表すことができます。
r: 4 w: 2 x: 1
たとえば、ファイル所有者の場合、次のように8進数モードを使用できます。 8進数のファイルの読み取り、書き込み、および実行(完全)許可は0 + r + w + x = 0 + 4 + 2 + 1 = 7
8進数のファイルに対する読み取りおよび書き込み権限のみが0 + r + w + x = 0 + 4 + 2 + 0 = 6です
8進数のファイルの読み取りと実行の許可のみ0 + r + w + x = 0 + 4 + 0 + 1 = 5
上記の方法を使用して、グループおよびその他の権限を計算します。所有者に完全な許可を与え、グループに読み取りと実行の許可を与え、他のユーザーに読み取り専用の許可を与えたい場合、次のように許可を計算する必要があります:User = r + w + x = 0 + 4 + 2 + 1 = 7グループ= r + w + x = 0 + 4 + 2 + 0 = 6その他= r + w + x = 0 + 0 + 0 + 1 = 1
有効な許可は761です。
「755」スタイルのパーミッションと 'ls' の詳細 Adam Courtemanche on AgileAdam.com 、作成できます エイリアスlso
ls -l
のように機能しますが、出力をわずかに処理します1 許可も8進数で表示します。これにより、3桁を示す先頭の列が追加されます2 8進数の許可。書かれているように、これはほとんどのファイルとディレクトリで機能しますが、 sticky または setuid/setgid ビットが設定されている場合は正しく機能しません。3
alias lso="ls -alG | 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}'"
ただし、これには深刻な欠点があります techtonikpoints out引数を渡すことはできません このlso
エイリアスに ls
コマンド と同じように、 代わりにawk
。したがって、特定のファイルまたはディレクトリでlso
を実行したり、lso
にオプション(-F
や--color
など)を渡すことはできません。
修正は、エイリアスではなくlso
function として定義することです。
lso() { ls -alG "$@" | 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}'; }
シェルでこれをインタラクティブに試す場合は、unalias lso
を実行してエイリアスを削除します。関数を定義する前でも後でも、エイリアスを削除できます。 ~/.bashrc
などのソースファイルに配置する場合は、alias
行を取り出して、関数定義を追加してください。
なぜこれが機能するのですか?エイリアスとは異なり、 bashシェル関数は位置パラメータを取ることができます 、つまり コマンドライン引数"$@"
は完全な引数リストに展開されます 。これにより、lso
関数の引数がls
に渡されます。 (エイリアス定義とは異なり、関数本体は引用符で囲まれません。したがって、\
および$
の前に"
charactersを削除する必要がありました。)
この方法で関数として定義すると、オプションをlso
に渡すことができるため、定義から-a
および-G
オプションを削除することができます。あなたはそれらが欲しい。 ( -l
オプションは、ファイル許可などの詳細を表示するために必要ですat 。したがって、削除するメリットはありません。)
lso() { 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}'; }
おかげで techtonik for 制限を指摘 エイリアスとしてlso
を定義するため、代わりにそれを機能にすることについての資料でこの投稿を拡大するように私を動機付けました。
1これは軽視されているように見えるかもしれません ls
からの出力を解析しないことに関する一般的な規則 。 ls
は、非常に人間が読み取れる出力を生成します。これにより、特異性と制限が導入され、一般に他のコマンドの入力としては不適切になります。 この場合ls
を解析します。なぜなら、私たちはls
の正確な動作を保持したいからです。 one変更を追加しました。
2以下に示す関数バージョンにも適用され、バグと見なされる可能性があるこのエイリアスの1つの制限は、4番目の8進数がゼロの場合でも3桁の8進数のみを表示することですjfmercer には 正しく指摘 があるため、ここに表示される8進数はスティッキービット(setuidまたはsetgidビット)を反映しません。
3単に4番目の8進数を表示しないことよりももっと深刻なのは、このメソッドはが設定されていないことを想定していることです、設定されていない場合は許可文字列のt
、s
、またはS
--その後、8進数を無視する必要があります。これは、スティッキーsetuid/setgidビットを考慮しない方法でビットが許可文字列から推測されるためです。
以前の「統計」関連の回答を拡張/簡略化するだけです:
単に実行できます:
stat <path_to_file>
出力には、他の情報とともに8進数の許可が含まれます。
詳細(統計バージョンと例):
# stat --version
stat (GNU coreutils) 8.4
[user@localhost ~]# touch /tmp/TEST_PERMISSONS
[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS
[user@localhost ~]# stat /tmp/TEST_PERMISSONS
File: `/tmp/TEST_PERMISSONS'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 1010058 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300
以下に注意してください:(0644 /-rw-r--r--)
移植性のために、Perl
を使用できます。
$ Perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 Perl.txt
エラーが発生したときに通知する場合は、次を試してください。
Perl -e '
for (@ARGV) {
print "$!: $_\n" and next unless -e;
printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
find
を-printf
アクションで使用できます。ls
は8進数の許可を表示しませんが、このfind
ベースの回避策を使用できます。
find path -printf "%m:%f\n"
たとえば、ビデオディレクトリを確認するには:
$ find Videos -printf "%m:%f\n"
755:Videos
%m
形式指定子は、-printf
アクションに8進数の許可を出力するように指示しますが、%f
形式指定子はファイル名を出力します。
複数のファイル名をfind
に渡すことができます。グロブ(find * -printf "%m:%f\n"
など)を使用することもできます。
-name
や-iname
のようなテストを使用する必要はありません。 find
への開始点として、興味のあるファイルまたはディレクトリの名前を渡すだけで十分です。つまり、上記に示すように、Word find
の直後に引数として名前を指定します。
find
を使用すると、出力の表示方法を細かく制御できます。特に役立つと思われる2つの変更点があります。
デフォルトでは、find
は、ls -R
と同様にサブディレクトリを再帰します。 find
に渡した開始点のサブディレクトリにアクセスしたくない場合は、-maxdepth 0
を追加できます(または、-maxdepth
を他の値と一緒に使用して、深さを指定できます)。
$ find Documents -maxdepth 0 -printf "%m:%f\n"
755:Documents
%f
はファイル名のみを表示するため、find
を再帰してファイルにアクセスする必要がある場合、ファイルの場所がわからない場合があります。ファイルが見つかった開始点から始まるパスを表示するには、代わりに%p
を使用します。
$ find /boot -printf "%m:%p\n"
755:/boot
644:/boot/initrd.img-4.4.0-92-generic
600:/boot/System.map-4.4.0-93-generic
600:/boot/vmlinuz-4.4.0-92-generic
600:/boot/vmlinuz-4.4.0-93-generic
....
find
コマンドの使用の詳細については、 man find
を参照してください。
ls
およびawk
)これを使用して、すべてのディレクトリファイルとそのアクセス許可を一覧表示できます。
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}'
これは、基本的に Adam Courtemancheのlso
エイリアス と同じコマンドであり、 その答え が引用されており、単一のコマンドとして実行されます。これを一度しか使用しない場合、またはまれにしか使用しない場合は、エイリアスまたはシェル関数としてわざわざ書きたくない場合があります。