对于任何了解 find 命令的人来说,这个问题似乎很简单。但我们假设 find 命令在我的系统上不起作用。如何在不使用“find”命令的情况下根据文件的权限查看文件?
答案1
如果没有find
,您仍然有一个 shell(可以扩展通配符),并且可以循环遍历目录的内容,首先检查每个文件是否为文件,然后检查它是否不可写,然后检查它是否不可执行,然后检查它是否可读。
有人可能会编写一个脚本来演示,但从阅读文档开始会有所帮助,例如,POSIX测试。
顺便说一下,使用“仅有的问题标题中的“将排除文件可写或可执行的结果。在POSIXfind
,你可以这样表达:
find . -type f \! \( -perm -u=w -o -perm -u=x -o -perm -g=w -o -perm -g=x -o -perm -o=w -o -perm -o=x \)
GNUfind
提供允许更紧凑表达式的扩展:
find . -type f \! -perm /u=wx,g=wx,o=wx
该test
实用程序(更常用作[
和]
)提供比 更简单的测试find
,例如,
for name in *; do [ -f "$name" -a -r "$name" -a ! -w "$name" -a ! -x "$name" ] && ls -l "$name"; done
但是,其权限仅适用于用户, 不是团体或者其他。要根据这些排除文件,您可以使用ls
,例如,
for name in *; do [ -f "$name" ] && case "$(ls -l "$name")" in -r--r--r--*) echo "$name";; esac; done
或(如果您想允许可执行文件)
for name in *; do [ -f "$name" ] && case "$(ls -l "$name")" in -r-?r-?r-*) echo "$name";; esac; done
答案2
您可以ls -l
结合使用grep
:
ls -l | grep -e "-r[w-][x-][r-][w-][x-][r-][w-][x-]"
这将只显示您具有读取权限的文件。如果您[-d]
在模式开头添加而不是破折号,您还将获得目录。
答案3
您可以使用,
# for file in /your/path/*; do [ -r "$file" ] && [ -f "$file" ] && printf '%s\n' "$file"; done
-r
代表文件存在并且已授予读取权限。
要查找可读文件,无论所有者、组或其他人如何,可以检查r
ls 的文件权限列中的标志。
ls -l | awk '$1 ~ /r/'
答案4
和zsh
:
view ./*(.^f-444)
或者:
view ./*(.r,.A,.R)
将查看至少设置了一个读取权限位的非隐藏常规文件。相当于:
find . ! -name . -prune ! -name '.*' -type f \(
-perm -001 -o -perm -010 -o -perm -100 \)
或使用 GNU find
:
find . -maxdepth 1 ! -name '.*' -type f -perm /444
尽管:
view ./*(.e:'[ -r $REPLY ]':)
将查看非隐藏的常规文件你有阅读权限。相当于:
find . ! -name . -prune ! -name '.*' -type f -exec test -r {} \; -print
或者使用 GNU find
:
find . -maxdepth 1 ! -name '.*' -type f -readable
和:
view ./*(.f-7333^f-444)
查看仅设置了读取权限位(至少一位)的非隐藏常规文件。
GNU 的等价物find
:
find . -maxdepth 1 ! -name '.*' -perms /444 ! -perms /7333