Shell
列出所有人執行檔的替代方法
我正在尋找您能想到的所有替代方法來列出目前目錄和子目錄中任何人(所有者、組、其他人)都可以執行的文件。
對於替代方法,我的意思是那些不使用 find 命令的方法:
find -L . -type f -perm -111 find -L . -type f -perm -a=x
我希望看到的一種方法是 ls 和 grep 的組合。
通過使用
ls
和grep
:ls -lAR | grep "^\-..x..x..x"
-l:以 rwx 格式顯示權限。
-R:遞歸。
ls
輸出通常不能可靠地進行後處理。如果您可以保證文件名不包含換行符,您可以這樣做:
ls -AlLR ./| grep -E '^-(..[[:lower:]]){3}'
即以
-
(僅限正常文件)開頭的列印行,並且 pmission 欄位中每組 3 個字元中的第三個字元是小寫字母(實際上,通常是,x
或.某些系統可能有副檔名,但如果文件是可執行的,則將其設為小寫字母)。s``l``t
請注意,它只會列印文件名,而不是其完整路徑。
使用
zsh
,您還可以執行以下操作:printf '%s\n' **/*(D-.f+111)
或者:
printf '%s\n' **/*(D-.f:a+x:)
從內部
bash
:zsh -c 'printf "%s\n" **/*(D-.f+111)'
我想您正在使用
-L
您的find
方法,因為對於符號連結,您想要檢查符號連結的目標。-
這就是上面標誌的目的。
find
但是請注意, ’s 的另一個副作用-L
是它會下降到目錄的符號連結中。相同的情況會發生ls -LR
,而不是zsh
上面的解決方案。如果您真的想下降到目錄的符號連結,請將 替換為**
,***
如果您想避免find
使用 GNUfind
(如在 Ubuntu 上找到)下降到目錄的符號連結,您可以執行以下操作:find -L . \( ! -xtype l -o -prune \) -type f -perm -111
在任何情況下,所有這些都沒有考慮到文件,這些文件的權限本身就可以讓每個人都可以執行它們,但它們位於每個人都無法搜尋的目錄中。如果 ACL 或其他安全措施到位,它也可能給出不正確的結果。
要考慮路徑組件的可搜尋性,您可以執行以下操作:
find -L . \( ! -xtype l -perm -111 -o -prune \) -perm -111
(假設通向目前工作目錄本身的所有路徑組件也是 world-searchabe)