如何在 Unix 中使用一个命令更改目录的所有文件权限?
答案1
要非递归地更改文件或目录条目的权限,请使用以下chmod
命令(请参阅手册修改模式阅读有关其具体选项的更多信息):
chmod +x dir # Set a directory to be listable
chmod +x file # Set a file to be executable
要递归地更改文件/目录的所有者(影响所有后代):
chown -R username dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group
要更改目录中所有文件的权限位,递归地:
find dir -type f -exec chmod 644 {} ';' # make all files rw-r-r-
更改所有目录的权限位:
find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x
如果你能这样做就好了:
chmod -R 755 dir
但是,这存在问题。它将文件和目录视为相同。上述命令使目录可由所有用户列出和读取,但它也使所有文件都可执行,这通常是您不想做的。
如果我们将其更改为644
,我们会遇到另一个问题:
$ chmod -R 644 x2
chmod: cannot access `x2/authors.html': Permission denied
chmod: cannot access `x2/day_of_week.plot': Permission denied
chmod: cannot access `x2/day_of_week.dat': Permission denied
chmod: cannot access `x2/commits_by_year.png': Permission denied
chmod: cannot access `x2/index.html': Permission denied
chmod: cannot access `x2/commits_by_year.plot': Permission denied
chmod: cannot access `x2/commits_by_year_month.plot': Permission denied
chmod: cannot access `x2/files_by_date.png': Permission denied
chmod: cannot access `x2/files.html': Permission denied
...
问题是644
删除了目录列表位,而这个副作用阻止了文件树的进一步遍历。您可以使用 来解决这个问题sudo
,但最终得到的目录对非 root 用户来说仍然完全无用。
关键是,chmod -R
在某些情况下(例如),它可以正常工作chmod -R g-r
,但在您想要弄乱位的情况下则不行-x
,因为它会不加区分地对文件和目录进行操作。
答案2
chmod
有一个-R
标志,表示递归更改文件和目录的权限。
您可以使用大写字母“X”对文件夹执行正确的操作:“X”=“仅当文件是目录或某些用户已具有执行权限时才执行/搜索”
因此,例如: chmod -R ug=rwX,o-rwx 。
会使整个树仅对每个文件的所有者和组可访问,而其他任何人都无法访问。任何已经可执行的文件在之后仍可执行,并且所有目录都会为用户和组显示“x”,而其他目录则不显示。
答案3
chmod -R <file permission> *
来自的手册页chmod
:
-R, --recursive
change files and directories recursively
使用chmod
带有-R
开关的多个方向,其子目录树包含数百万个文件,并且您想要一次性更改这些文件的文件权限。
文件权限可能是例如 777、755、644 等等。