我编写了一个脚本来更改目录中所有文件的权限:
#!/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)
让他们中的许多人恢复了相对正常,但许多人仍然严重腐败。我相信这是由于硬件问题(从磁盘上取出好文件,然后扔掉它)。