find
所有实现必须遵守的相关标准是http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html。
也就是说,-readable
被添加为标准的扩展,因为它添加了标准find
没有的功能。如果没有它,我们需要牺牲性能或正确性。
正确但缓慢
如果您真的想在所有情况下都 100% 正确,请考虑在 外部进行测试find
,如下所示:
find /home -type f -name '.*' '(' -exec test -r '{}' \; ')' -print
这样,我们实际上是在测试(与计算)每个文件的可读性。
较慢(使用 Shell-Builtin 评估)
find /home -type f -name '.*' -exec sh -c '
for filename; do test -r "$filename" && printf "%s\n" "$filename"; done
' _ {} +
这不是为每个文件启动一个副本,而是每批文件test
启动一个sh
(每批的大小取决于命令行上可以容纳的文件名的数量),并使用该实例中test
内置的副本sh
来评估和打印,那些名字。
快速但不完美
以下仅对由于显式文件权限而看起来不可读的文件运行上述昂贵的测试:
find /home -type f -name '.*' \
'(' \
'(' \
'(' -perm -0004 ')' -o \
'(' -group "$(id -g)" -perm -0040 ')' -o \
'(' -user "$(id -u)" -perm -0400 ')' \
')' -o '(' -exec test -r '{}' \; ')' \
')' -print
也就是说:
-perm 0004
匹配所有世界可读的文件
-group "$(id -g)" -perm -0040
匹配所有以当前用户的主组为组且组可读的文件。
-user "$(id -u)" -perm -0400
匹配当前用户拥有的所有文件。
-exec test -r '{}' \;
尽管没有通过上述任何测试(例如,由于次要组成员身份),但仍可读取文件的最终过滤器。这个测试很慢,所以我们只在通过其他方式看起来不可读的文件上运行它。
这在不寻常的极端情况下可能不准确,例如具有 ACL 或其他扩展权限修改其可读性的文件。