如何在不使用-readable标志的情况下返回bash中当前用户可读的隐藏文件列表?

时间:2017-10-23 19:18:39

标签: unix find-util

我想运行一个命令,输出当前用户可以读取的所有隐藏文件 - 在Bash中。

到目前为止,我正在使用find命令,-perm但我似乎无法获取当前用户可以读取的文件,但是当前用户的GROUP的成员可以读取文件。出于测试目的,我只查看/home/目录。这是通过以下方式实现的:

find /home/ ! -perm u+r -regextype egrep -regex '^(/.+)*/\..*')' 2>/dev/null

我不想使用-readable标记,因为find

的所有实现都不支持它

我可以使用八进制的魔术权限吗?

1 个答案:

答案 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

这样我们就可以测试(计算)每个文件的可读性。

慢一点(使用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或其他扩展权限的文件会修改其可读性。