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
每个文件转换为一个新文件,但我很好奇如何修复原始文件的权限。
除了评论中给出的答案之外,您还应该注意,您的脚本会在任何包含空格的文件名上中断。
您可以在单个命令中使用 完成所有这些操作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)
不过,我认为您不需要这个,因为一旦从“文档”中删除了执行权限,那么它的子目录将无法访问,因此不会从它们中删除执行权限。