mis*_*lav 13 ls bash permissions stat
我想从 bash 脚本检查文件的组权限。具体来说,我需要检查文件是否具有组可写位。
就是这样。就那么简单。然而:
test -w <file 不会告诉我它是否是组可写的。ls -ld对人类很好,但对脚本不太确定。从技术上讲,我可以解析输出,例如drwxrwxr-x提取组位,但这似乎很脆弱。statOS X 和其他系统之间的接口完全不兼容。find <file> -perm ... 不可能是答案?您可以使用该stat命令来获取权限位。stat可在大多数 Unix 上使用(OSX、BSD,而不是我能找到的 AIX)。这应该适用于大多数 Unix,除了我能找到的 OSX 和 BSD。
$ stat -c "%a" <file>
Run Code Online (Sandbox Code Playgroud)
$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct 6 14:16 afile.txt
Run Code Online (Sandbox Code Playgroud)
使用这个命令:
$ stat -c "%a" afile.txt
664
Run Code Online (Sandbox Code Playgroud)
并使用简单的grep方式查看组权限模式是 6 还是 7。
$ stat -c "%a" afile.txt | grep ".[67]."
Run Code Online (Sandbox Code Playgroud)
对于 OSX 和 BSD,您需要使用这种形式的stat, stat -f(或者也许stat -x),并进行相应的解析。由于选项stat不同,您可以将此命令包装在一个lsb_release -a命令中,并根据操作系统调用适当的版本。不理想但可行。要知道,lsb_release是仅适用于Linux发行版那么另一种选择将需要设计用于测试其他Unix操作系统。
我认为这个命令可能会更好地为您服务。我利用find和printf开关。
$ find a -prune -printf '%m\n'
664
Run Code Online (Sandbox Code Playgroud)
Perl 可能是一种更便携的方式来执行此操作,具体取决于您尝试涵盖的操作系统。
$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664
Run Code Online (Sandbox Code Playgroud)
注意:以上使用 Perl 的stat()函数来查询文件系统位。
您可以通过放弃使用数组@pv, 并stat()直接处理以下输出来使其更紧凑:
$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664
Run Code Online (Sandbox Code Playgroud)
我最终解析ls:
is_group_writable() {
local ls="$(ls -ld "$1")"
[ "${ls:5:1}" = "w" ]
}
Run Code Online (Sandbox Code Playgroud)
我很感谢@slm 的广泛回答,但其他方法都没有那么简单。该stat方法需要我编写至少两个不同的调用来覆盖 OS X,即使之后它返回我仍然需要对其应用算术的八进制表示形式。Perl 方法还可以,但需要我为这样一个简单的任务启动一个解释器,我想保持简单并仅使用 posix utils。
| 归档时间: |
|
| 查看次数: |
13356 次 |
| 最近记录: |