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

Big*_*uge 6 permissions chmod chown

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

#!/bin/bash

files=`find "$1"`

for f in $files; do
    chown "$2" "$f"
    chmod 600 "$2"
done
Run Code Online (Sandbox Code Playgroud)

显然, 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
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ard 6

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

您可以在单个命令中使用 完成所有这些操作find,而不是尝试解析从find. 更加健壮;处理文件名而不管特殊字符或空格。

find "$1" -type f -exec chown "$2" {} \; -exec chmod 600 {} \;
Run Code Online (Sandbox Code Playgroud)

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


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

chmod u+x Documents
Run Code Online (Sandbox Code Playgroud)

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

find Documents -type d -exec chmod u+x {} \;
Run Code Online (Sandbox Code Playgroud)

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