ファイルのアクセス許可を設定するchmodコマンドがありますが、コマンドラインから8進モード(755など)でファイルのアクセス許可を取得できますか?
stat --format "%A" $FILE
人間が読めるdrwxr-x---
形式を提供します。役に立つかもしれないしそうでないかもしれません。
ファイルのアクセス許可を設定するchmodコマンドがありますが、コマンドラインから8進モード(755など)でファイルのアクセス許可を取得できますか?
stat --format "%A" $FILE
人間が読めるdrwxr-x---
形式を提供します。役に立つかもしれないしそうでないかもしれません。
回答:
あなたが試すことができます
stat -c "%a %n" *
*
調査する関連ディレクトリまたは正確なファイル名に置き換えます。
-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/
stat -f '%A %a %N' *
(クレジット:geeklog.adamwilson.info/article/58/…)
ls
:for f in $(ls -a); do stat -c "%a %n" $f; done;
ls
は悪い考えです。本当にループを使用したい場合は、できることfor f in *; do stat "%a %n" "$f"; done
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です。
AgileAdam.comのAdam Courtemancheによる「ls」を使用した「755」スタイルのアクセス許可で詳しく説明されているように、出力1のように機能するがわずかに処理してエイリアスも8進数で表示するエイリアスを作成できます。これにより、3桁の2オクタル許可を示す先頭の列が追加されます。書かれているように、これはほとんどのファイルとディレクトリで機能しますが、スティッキーまたはsetuid / setgidビットが設定されている場合は正しく機能しません。3 lso
ls -l
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}'"
ただし、techtonikが 指摘しているように、これには深刻な欠点があります。あなたは、引数を渡すことはできませんこれにlso
あなたが同じようにエイリアスコマンドそれらが追加の引数として取られているので、代わりに。したがって、あなたは実行することはできません特定のファイルやディレクトリに、またあなたは、任意のオプション(のように渡すことができ、またはをします)。ls
awk
lso
-F
--color
lso
修正方法は、エイリアスではなく関数lso
として定義することです。
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
ます。(エイリアス定義とは異なり、関数本体は引用符で囲まれていません。したがって、およびの\
前の文字を削除する必要が$
ありました"
。)
lso
この方法で関数として定義された場合にオプションを渡すことができるため、定義から-a
と-G
オプションを削除したい場合があります。必要な場合は手動で渡すことができます。(オプションは、ファイルのアクセス権などの詳細情報が表示されるために必要とされるすべてで、それを削除する利点はありません。)-l
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に感謝します。そのため、代わりに機能にすることについての資料でこの投稿を拡大したいと思います。lso
1これは、からの出力を解析しないという一般的なルールls
を無視しているように見えるかもしれません。ls
人間が判読できる出力を生成します。これにより、特異性と制限が導入され、一般に他のコマンドの入力としては不適切になります。この場合、我々は解析ls
以来、私たちはの正確な動作を保持したいls
私たちを除いて1つのを追加変更。
2下に示す関数バージョンにも適用され、バグと見なされる可能性があるこのエイリアスの1つの制限は、4番目の8進数がゼロの場合でも 3桁の8進数のみを表示することです。以下のようjfmercerがいる正しく指摘し、ここで表示される8進数字は、スティッキービット存在する場合、またsetuidまたはsetgidのビットを反映するものではありません。
3もっと真剣に単に第8進数が表示されないよりも、この方法では、ということであると仮定し、彼らが設定されていない、とあなたが見たら-彼らはしている場合t
、s
あるいはS
許可列に-そして、あなたは8進数を無視すべきです。これは、スティッキーsetuid / setgidビットを考慮しない方法でアクセス許可文字列からビットが推測されるためです。
awk: read error (Is a directory)
--color
ショーの色のパラメーターを追加できますlso() { ls -alG "$@" --color | 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}'; }
以前の「統計」関連の回答を拡張/簡略化するだけです:
以下を実行するだけです:
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
ながら、オクタル許可を印刷するためのアクションを%f
書式指定子が、それはファイル名を印刷させます。
複数のファイル名をに渡すことができますfind
。グロブ(例:)を使用することもできfind * -printf "%m:%f\n"
ます。
-name
またはのようなテストを使用する必要はありません-iname
。興味のあるファイルまたはディレクトリの名前を開始点として渡すだけで十分ですfind
。つまり、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
....
コマンドのman find
使用に関する詳細については、を参照してください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
エイリアスと同じコマンドであり、その答えは引用されており、単一のコマンドとして実行されます。これを一度しか使用しない場合、またはまれにしか使用しない場合、エイリアスまたはシェル関数としてわざわざ書きたくない場合があります。