Bash
如何檢查文件的組權限
我想從 bash 腳本中檢查文件的組權限。具體來說,我需要檢查一個文件是否有組可寫位。
就是這樣。就那麼簡單。然而:
- 我也需要這個是便攜的。
test -w <file
不會告訴我它是否是組可寫的。- 的輸出
ls -ld
對人類來說很好,但對腳本不太確定。從技術上講,我可以解析輸出,例如drwxrwxr-x
提取組位,但這似乎很脆弱。- OS X 和其他系統的介面
stat
完全不兼容。find <file> -perm ...
不可能是答案嗎?
我最終
ls
- 解析:is_group_writable() { local ls="$(ls -ld "$1")" [ "${ls:5:1}" = "w" ] }
我很感謝@slm 的廣泛回答,但其他方法都不是那麼簡單。該
stat
方法需要我編寫至少兩個不同的呼叫來覆蓋 OS X,即使之後它返回我仍然必須對其應用算術的八進製表示。Perl 方法還可以,但需要我為這樣一個簡單的任務啟動一個解釋器,我想保持簡單並且只使用 posix utils。
方法 #1 - 統計
您可以使用該
stat
命令來獲取權限位。stat
在大多數 Unix 上都可用(OSX、BSD,而不是我能找到的 AIX)。這應該適用於大多數 Unix,除了我能找到的 OSX 和 BSD。$ stat -c "%a" <file>
例子
$ ls -l a -rw-rw-r-- 1 saml saml 155 Oct 6 14:16 afile.txt
使用這個命令:
$ stat -c "%a" afile.txt 664
並使用一個簡單
grep
的來查看組權限模式是6還是7。$ stat -c "%a" afile.txt | grep ".[67]."
對於 OSX 和 BSD,您需要使用這種形式的
stat
,stat -f
(或者可能是stat -x
),並進行相應的解析。由於選項stat
不同,您可以將此命令包裝在lsb_release -a
命令中並根據作業系統呼叫適當的版本。不理想但可行。意識到這lsb_release
僅適用於 Linux 發行版,因此需要設計另一種替代方案來測試其他 Unix 作業系統。方法 #2 - 查找
我認為這個命令可能會更好地為你服務。我利用
find
和printf
開關。例子
$ find a -prune -printf '%m\n' 664
方法 #3 - Perl
Perl 可能是一種更便攜的方式來執行此操作,具體取決於您要涵蓋的作業系統。
$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;' 0664
**注意:**以上使用 Perl 的
stat()
函式來查詢文件系統位。您可以通過放棄使用數組 ,
@pv
並直接處理以下輸出來使其更緊湊stat()
:$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;' 0664