我想运行一个命令,输出当前用户可以读取的所有隐藏文件 - 在Bash中。
到目前为止,我正在使用find
命令,-perm
但我似乎无法获取当前用户可以读取的文件,但是当前用户的GROUP的成员可以读取文件。出于测试目的,我只查看/home/
目录。这是通过以下方式实现的:
find /home/ ! -perm u+r -regextype egrep -regex '^(/.+)*/\..*')' 2>/dev/null
我不想使用-readable
标记,因为find
我可以使用八进制的魔术权限吗?
答案 0 :(得分:1)
所有find
实施必须遵守的相关标准是http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html。
也就是说,-readable
被添加为标准的扩展,因为它增加了标准find
没有的功能。如果没有它,我们需要妥协性能或正确性。
如果您确实希望在所有情况下100%正确,请考虑在find
外部进行测试,如下所示:
find /home -type f -name '.*' '(' -exec test -r '{}' \; ')' -print
这样我们就可以测试(计算)每个文件的可读性。
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或其他扩展权限的文件会修改其可读性。