glob,但不忽略“权限 denied”

2 投票
1 回答
2849 浏览
提问于 2025-04-17 10:04

在Python中,使用glob这个工具时,它会忽略“权限被拒绝”的错误。可惜的是,我需要知道是否有我无法读取的目录。

我可以使用os.walk()和fnmatch来解决这个问题,但也许还有更好的办法?

举个例子:

user@pc:~
===> python
>>> import glob
>>> glob.glob('/root/*')
[]

/root目录下有一些文件,但用户user@pc没有权限读取这个目录。

仅仅知道一个异常是不够的。比如说使用glob.glob('/var/log/*/*.log')这个命令。我想知道哪些目录是存在的,但我无法访问。

1 个回答

3

一种获取所有无法读取的目录和文件的方法是使用 os.walk 来递归遍历一个目录树。然后,对于每个目录和文件,使用 os.access 来检查它们的权限。

import os

unreadable_dirs = []
unreadable_files = []

for dirpath, dirnames, filenames in os.walk('/var/log'):
  for dirname in dirnames:
    dirname = os.path.join(dirpath, dirname)
    if not os.access(dirname, os.R_OK):
      unreadable_dirs.append(dirname)
  for filename in filenames:
    filename = os.path.join(dirpath, filename)
    if not os.access(filename, os.R_OK):
      unreadable_files.append(filename)

print 'Unreadable directories:\n{0}'.format('\n'.join(unreadable_dirs))
print 'Unreadable files:\n{0}'.format('\n'.join(unreadable_files))

注意:你可以自己写一个递归函数来遍历目录结构,但这样其实就是在重复 os.walk 的功能,所以我觉得没有必要使用 glob.glob

撰写回答