0

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

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

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

我不想使用该-readable标志,因为并非所有实现都支持它find

是否有一些神奇的八进制权限可以用来执行此操作?

4

1 回答 1

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 或其他扩展权限修改其可读性的文件。

于 2017-10-23T19:31:21.727 回答