在 bash 中,如何输出目录的不可读内容?
例如,假设目录是~/foo
,并且有一个不可读的文件夹~/foo/folder
,其中包含一个文件~/foo/folder/file1.txt
,以及另一个不可读的文件~/foo/file2.txt
。我想输出:
~/foo/folder cannot be read.
~/foo/folder/file1.txt cannot be read.
~/foo/file2.txt cannot be read.
在 bash 中,如何输出目录的不可读内容?
例如,假设目录是~/foo
,并且有一个不可读的文件夹~/foo/folder
,其中包含一个文件~/foo/folder/file1.txt
,以及另一个不可读的文件~/foo/file2.txt
。我想输出:
~/foo/folder cannot be read.
~/foo/folder/file1.txt cannot be read.
~/foo/file2.txt cannot be read.
目录权限很有趣。如果您没有目录的读取权限,则无法通过系统调用(例如 ,等readdir()
命令,甚至 shell 生成文件名列表的方式)找出其中包含哪些文件。find
ls
如果您对某个目录具有读取权限,则可以在该目录中找到文件的基本列表,但您需要“执行”权限才能访问这些文件,甚至可以找出文件权限。
如果您有执行权限但没有读取权限,但您知道目录中文件的名称,您可以列出该文件并访问它(如果文件权限允许您这样做)。
因此,如果该目录不可读但您对该目录具有执行权限,则可以调查该目录中您知道的任何文件。但是,您无法找出那里有哪些文件。
如果您无法读取文件夹~/foo/folder
,则您无法检测其中的任何文件,无论它们是否可读。
如果您可以阅读~/foo
,则可以检查所有文件和目录并测试它们是否可读:
find ~/foo | while read file; do
if test \! -r "$file"; then
echo "$file cannot be read"
fi
done