使用 ????????? 修复文件权限

使用 ????????? 修复文件权限

我编写了一个脚本来更改目录中所有文件的权限:

#!/bin/bash

files=`find "$1"`

for f in $files; do
    chown "$2" "$f"
    chmod 600 "$2"
done

显然, chmod 的第二个参数应该"$f"代替"$2"。但是,当我运行脚本(在一个小目录上)时,我也忘记包含第二个参数,它应该是"dave:dave".现在,目录中的所有文件都完全乱了:

~ $ ll Documents/                                                                                                      
ls: cannot access Documents/wiki.txt: Permission denied
ls: cannot access Documents/todo.txt: Permission denied
ls: cannot access Documents/modules.txt: Permission denied
ls: cannot access Documents/packages.txt: Permission denied
total 0
-????????? ? ? ? ?            ? modules.txt
-????????? ? ? ? ?            ? packages.txt
-????????? ? ? ? ?            ? todo.txt
-????????? ? ? ? ?            ? wiki.txt

运行sudo chown dave:dave Documents/*sudo chmod 600 Documents/*不会引发任何错误,但文件保持不变。我知道我可以将sudo cat每个文件放入一个新文件中,但我很好奇如何修复原始文件的权限。

答案1

除了注释中给出的答案之外,您还应该注意,您的脚本将在任何包含空格的文件名上中断。

您可以使用单个命令来完成所有这些操作find,而不是尝试解析从 输出的文件名列表find。更加坚固;处理文件名而不考虑特殊字符或空格。

find "$1" -type f -exec chown "$2" {} \; -exec chmod 600 {} \;

请注意,如果chown在给定文件上失败,则chmod不会在该文件上运行。无论如何,这可能就是您想要的行为。


由于您已经运行了一个错误的命令,从“文档”目录中删除了执行权限,因此您需要重新添加执行权限:

chmod u+x Documents

如果有更多目录被错误地删除了执行权限,您应该能够使用以下方法修复它们:

find Documents -type d -exec chmod u+x {} \;

不过,我认为您不需要这个,因为一旦从“文档”中删除了执行权限,那么它的所有子目录都将不可访问,因此不会从其中删除执行权限。

答案2

有一次我看到具有如此奇怪权限的文件,是在严重地文件系统搞乱了。一轮融资fsck(8)让他们中的许多人恢复了相对正常,但许多人仍然严重腐败。我相信这是由于硬件问题(从磁盘上取出好文件,然后扔掉它)。

相关内容