Linux:仅对目录设置权限

39

我需要更改Apache中htdocs目录的权限为特定组,并具有特定的读/写/执行权限。

目录需要具有775权限,文件需要具有664权限。

如果我对htdocs进行递归的664更改,则所有文件和目录都将更改为664。

我不想手动更改目录。

是否有一种方法只更改文件或目录?

7个回答

73

chmod 命令本身就可以实现这个功能;X 符号权限表示“执行,如果有意义”,通常适用于目录而非文件。因此,您可以使用以下命令:

chmod -R u=rwX,go=rX /path/to/htdocs

唯一的潜在问题是:如果任何一个普通文件已经设置了执行权限,chmod 就会认为这是有意的并保留它。如果这可能成为一个问题 你正在使用 GNU 版本的 chmod(也就是你在 Linux 上),你可以像这样删除任何杂乱的执行权限:

chmod -R a-x,u=rwX,go=rX /path/to/htdocs

很遗憾,这个技巧在 bsd(/macOS) 版本的 chmod 中不起作用(其他版本我不确定)。这是因为 bsd 版本基于“原始(未修改)模式”来应用 X 权限,即在进行 a-x 修改之前它是否有任何执行位(请参见man页面)。请注意保留 HTML 标签。

3
到目前为止,这是最好的答案。如果你有足够多的递归目录,xargs 最终会失败。更多信息请查看man 手册 - Jared Scott
1
为了解决现有执行标志仍然存在的潜在问题,您可以使用:`chmod -R a-rwx,u+rwX,go+rX`这将有效地删除用户、组和其他所有权限,然后只添加您需要的权限。 - Axel Wilczek
很遗憾,这个技巧只适用于某些版本的 chmod。但我会在我的答案中加上解释。 - Gordon Davisson

44
使用 find 命令的 `-type` 选项来限制操作对象为文件和目录。使用 `-o` 选项来指定不同类型的替代操作,这样你只需运行一次 `find` 命令,而不是单独为每种类型运行多次。
find htdocs -type f -exec chmod 664 {} + -o -type d -exec chmod 775 {} +

4
最好使用chmod内置的支持。请参阅下面Gordon Davisson的答案。 - Jared Scott
这个方法更好,因为如果您在不需要它的基本文件上有一堆 'x' 的混乱,上面的 find 方法可以清理掉它们所有,而 u=rwX,go=rX 并没有清理任何东西。 - IncredibleHat
这个操作非常顺利,节省了数小时的工作时间。谢谢! - cbloss793

6
使用find命令搜索目录并对其应用chmod命令:
find -type d | xargs chmod 775

使用类型f来表示文件:

find -type f | xargs chmod 775

4
高登上面的答案是正确的,但如果您想锁定对目录树的访问权限,它会将可执行脚本留给所有者和被授予大写X的任何人也可以执行。使用“chmod -R o-rwx directory”命令可以完全删除其他用户的访问权限,而不考虑他们是否有执行权限。
find <path> -type d -exec chmod 775 {} +

或者

find <path> -type d -exec chmod 755 {} +

更安全。

4

我使用的解决方案与Gordon提供的类似:

chmod -R ug=rw,o=r,a+X /path/to/folder/

对于文件夹应该始终设置为775,对于文件应该设置为664,即使之前已经为某个文件设置了执行权限。


2

尝试:

find htdocs -type d -exec chmod 775 {} +

这将设置目录权限,但不会设置文件权限。 - Barmar

-1

对于目录或文件

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接