如何在Linux中一步更改文件夹及其所有子文件夹和文件的权限?[关闭]


1805

我想在Linux中一步(命令)更改文件夹及其所有子文件夹和文件的权限。

我已经尝试过以下命令,但仅适用于上述文件夹:

chmod 775 /opt/lampp/htdocs

有没有一种方法可以chmod 755为其/opt/lampp/htdocs及其所有内容(包括子文件夹和文件)进行设置?

另外,将来,如果我在其中创建新文件夹或文件htdocs,如何将其权限自动设置为755

我也看了这个链接:

http://stackoverflow.com/questions/3740187/how-to-set-default-chmod-in-linux-terminal


4
您打算写chmod 75 /opt/lampp/htdocs还是应该写chmod 755 /opt/lampp/htdocs
HelloGoodbye

232
关于Linux的第4个投票最高的问题“被关闭为题外”这一事实很有趣。除了程序员,谁还会关心chmod?这离题如何?如果“权限”,“文件夹”和“ cmod”甚至不在主题之列,为什么会这样?
亚瑟·登特

8
@ArthurDent,因为此问题(虽然完全有效且很有帮助)更适合以系统为中心的SE网站,例如SuperUser或ServerFault。它与编程没有明确关系。
timelmer '18年

26
@timelmer可以,但是我再问一遍,为什么“权限”,“文件夹”和“ cmod”标签?什么时候可以将cmod“明确地”用于编程?
亚瑟·登特

9
如果您想真正变得挑剔,那么Bash实际上是一种脚本语言,但是php也是如此,因此SO似乎并不介意。
timelmer

Answers:


2955

其他答案是正确的,因为chmod -R 755将对树中的所有文件和子文件夹设置这些权限。但是,为什么要在地球上?这对于目录可能有意义,但是为什么要在所有文件上设置执行位?

我怀疑您真正想要做的是将目录设置为755,或者不理会这些文件,或者将它们设置为644。为此,您可以使用find命令。例如:

要将所有目录更改为755(drwxr-xr-x):

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

要将所有文件更改为644(-rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;

231
有人在乎解释到底这{} \;是什么意思吗?
Nilzor 2013年

307
@Nilzor chmod 644 {} \;指定将对find每个文件执行的命令。{}被文件路径替换,并且分号表示命令的结尾(转义,否则它将由shell而不是解释find)。
tobbez

25
“但是为什么在所有文件上设置执行位”为什么不呢?我是Ubuntu / Linux的
新手

12
@FlavorScape Womble专门在find返回的目录上设置执行位。目录的执行许可权允许用户类列出该目录的内容并cd进入该目录。一般而言,即使目录中可能只设置一个或多个,在某些情况下,您也希望目录中的r和x都可访问。有关更多信息,请参见本指南:nixsrv.com/llthw/ex23
Alexandr

25
除了sleepynate之外,每个响应都忽略了他的问题,即关于将来创建的文件/文件夹的权限设置的问题。
JGarrido 2014年

780

检查-R选项

chmod -R <permissionsettings> <dirname>

将来,您可以通过先检查手册页来节省大量时间:

man <command name>

因此,在这种情况下:

man chmod

147
那是man什么
亚当

36
它代表手册页,是一个Linux命令,显示命令的手册页(大多数linux命令都有手册页)。尝试男人ls或男人男人。
史蒂夫·罗比拉德

8
在Mac OS X的终端中,这对我不起作用。在那里,我执行了“ chmod -R <permissionsettings> <dirname> *”,并且它起作用了。
伊纳尔·奥拉夫松(EinarÓlafsson)2012年

127
我认为,到目前为止,在此处发布或使用Google的速度实际上比使用的速度更快man。尤其是对于像grep您这样的新手man来说,在文档中查找示例可能非常耗时,而Google或SO却可以在几秒钟内提供示例。
2013年

17
出于记录,那些不熟悉Linux的人可能不熟悉man。我只知道它的存在,但是想要弄清楚如何使用它,就需要Google本身冒险。可能是一个值得尝试的尝试,但您应该意识到,我通过Google找到了这个非常好的帖子,它回答了我所问的确切问题。资源,我的朋友。资源是无价的。您可能会认为这毫无意义,他应该检查一下那个人,但这对我和其他数百人(甚至数千人)有所帮助。所以请考虑一下。
Soundfx4

391

如果要将所有文件的权限设置为a+r,将所有目录的权限设置为a+x,并通过完整的子目录树递归执行此操作,请使用:

chmod -R a+rX *

X(即资本X,不小x!)的文件被忽略(除非它们是可执行的人的话),但用于目录。


27
好答案。请注意,*将不匹配隐藏文件(以点开头的名称)。因此,使用可能更有意义。(对于当前目录)。
亚伦·亚当斯

21
这是正确的答案。就我而言,我想将所有目录设置为775并将所有文件设置为664。@Pete的出色回答将我chmod引到了文档中,我确定可以使用chmod -R g+wX .。太棒了!
chadoh

8
x如果文件已经存在,则不会将其删除。
Benoit Duffez 2014年

5
如果还不清楚,则大写X表示“使所有目录可执行”(而不是文件)。
马特·布朗

4
@BenoitDuffez如果您的目标是还要从文件中删除可执行位,则可以组合指令,例如“ a-x + rX”以从所有内容中删除“ x”,然后将“ r”设置为所有内容,将“ x”设置为仅目录。
nunks

144

你可以用-Rchmod用于所有文件和子文件夹的递归遍历。

您可能需要sudo,因为它取决于当前用户或另一个用户正在安装的LAMP

sudo chmod -R 755 /opt/lampp/htdocs

17
不知何故,sudo chmod 755 -R /directory它不起作用,但是起作用sudo chmod -R 755 /directory了。奇怪的。顺便说一下,我正在使用Mac os x。
隆塞

8
根据我的经验,这是正确的。该标志必须直接出现在chmod之后,而不是字符串中的任何位置。
orionrush '16

1
以上书面命令是错误的。正确的递归命令是:sudo chmod -R 755 / opt / lampp / htdocs注意:-R应该在755之前
Sandip Patel-SM

该解决方案对于Redhat来说效果很好。谢谢!
Lavande

在RHEL上工作良好,并且sudo chmod 755 -R工作
AnBisw

79

正确的递归命令是:

sudo chmod -R 755 /opt/lampp/htdocs

-R:更改每个子文件夹,包括当前文件夹


1
嗨,您确定当前文件夹是否正确,尽管路径仍然是其中之一?
shareef

OSX使用:sudo chmod 777日志/ -R获取:chmod:-R:无此类文件或目录应为:sudo chmod -R 777日志/
elad silver

76

要(递归)设置所有子文件夹,请使用-R

chmod 755 /folder -R

并使用umask将默认设置为新文件夹/文件cd / folder umask 755


24
不要将您的umask电话设为755!您将无法列出,读取或使用您创建的任何文件或目录!
sleepynate's

14
您是说umask 022吗?
Xkeeper,2012年

4
这将全部设置为755,包括文件。
Patrick Mutwiri,2015年

@sleepynate您到底在说什么?755表示所有者可以读取,写入和执行,而所有其他用户可以读取和执行但不能写入对象
svin83

2
@NicHartley @ svin83 umask是将被权限屏蔽的位,因此它实际上是chmod的反函数。 λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
sleepynate '18

51

chmod 755 -R /opt/lampp/htdocs将递归设置权限。只能在设置权限后创建的此目录中自动设置文件的权限,但是可以通过设置来更改系统范围的默认文件权限umask 022


9
sleepynate的答案是唯一正确的答案。张贴者提出了两个问题:1)如何修复文件和文件夹的权限,以及2)如何更改默认值(意味着“未来”文件)。如前所述,第一个使用“ chmod”,第二个使用“ umask”。我还要补充一点,没有办法只在1个目录上更改umask ...每个用户的umask是“全部或全部”。但是没有什么可以阻止您创建一个新的用户,谁股群体与你,让你可以“须藤-u SomeUser的[创建文件]”那条条框框的思维一点,但它是一个很好的解决方法。
斯科特私法

我认为您是对的,但是不能解决inherit许多情况,或者它只能与NTFS-3G一起使用吗?
塞巴斯蒂安·施利希特

在未授予文件夹许可的情况下,将来可能会创建该文件夹,可能无法将文件夹复制,例如myforlder从其他地方(例如PC)复制到此目标目录(在服务器上),原因是它将尝试在其中创建新文件夹myfolder 您无权使用名称的目标目录。正如我所拥有的root,我只是使用chown -R username:usergroup /directory
杰森·目标

27

您可能要考虑 nik在超级用户上给出的答案,并对所有文件/文件夹使用“ one chmod”,如下所示:

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

9
警告,很容易遇到命令行限制。
Lothar's

1
我有此错误:-bash:/ bin / chmod:参数列表过长
Oleg Abrazhaev

最好使用-exec选项find来克服该Argument list too long错误。
miravalls


20

采用:

sudo chmod 755 -R /whatever/your/directory/is

但是,请注意这一点。如果更改错误的文件/文件夹的权限,可能会对您造成伤害。


20

这是将目录设置为775,将文件设置为664的另一种方法。

find /opt/lampp/htdocs \
\( -type f -exec chmod ug+rw,o+r {} \; \) , \
\( -type d -exec chmod ug+rwxs,o+rx {} \; \)

它可能看起来很长,但是由于以下三个原因,它很酷:

  1. 仅扫描一次文件系统,而不扫描两次。
  2. 提供对文件处理方式和目录处理方式的更好控制。当使用特殊模式(例如粘性位)时,此功能很有用,这很有用,您可能希望将其应用于目录而不是文件。
  3. 直接使用man页面之外的技术(请参阅下文)。

请注意,我尚未确认此解决方案与仅使用两个find命令(如Peter Mortensen的解决方案)之间的性能差异(如果有)。但是,在手册中看到类似的示例是令人鼓舞的。

man find页面示例:

find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)

Traverse the filesystem just once, listing setuid files and  direc‐
tories into /root/suid.txt and large files into /root/big.txt.

干杯


现在,如何在shell脚本中打开它,以便我们可以运行openmod $ folder?
StR

人们,请使用xargs。它节省了成千上万的流程调用。
seanahern

13

chmod -R 755 directory_name可以,但是如何将新文件也保存到755?文件的权限成为默认权限。


我做到了,但是无法从那里打开终端。我无法解决。
杜·盖安莎

9

对于Mac OS X 10.7(Lion),它是:

chmod -R 755 /directory

是的,正如其他所有人所说,在执行此操作时要小心。


9

您想确保适当的文件和目录是chmod-ed / permissions。对于您想要的所有目录

find /opt/lampp/htdocs -type d -exec chmod 711 {} \;

对于所有图像,JavaScript,CSS,HTML ...嗯,您不应该执行它们。所以用

chmod 644 img/* js/* html/*

但是对于所有逻辑代码(例如PHP代码),您应该设置权限,使用户看不到该代码:

chmod 600 file

6

我认为亚当正在询问如何为绑定操作的所有进程更改umask值 /opt/lampp/htdocs目录。

用户文件创建模式掩码(umask)用于确定新创建文件的文件权限。它可用于控制新文件的默认文件权限。

因此,如果您将使用某种ftp程序将文件上传到 /opt/lampp/htdocs,则需要将ftp服务器配置为使用所需的umask。

如果文件/目录是由php创建的,则需要修改php代码

<?php
umask(0022);
// other code
?>

如果要在bash会话中创建新文件/文件夹,则可以在shell配置文件〜/ .bashrc中设置umask值,也可以为所有用户设置umask /etc/bashrc/etc/profile文件。将以下内容添加到文件:umask 022

Sample umask Values and File Creation Permissions
If umask value set to   User permission     Group permission     Others permission
000                         all              all                   all
007                         all              all                   none
027                         all          read / execute            none

并更改已创建文件的权限,可以使用find。希望这可以帮助。


4

找到文件并将其应用于chmod它们有两个答案。第一个是find文件,并chmod在找到后应用(如@WombleGoneBad所建议)。

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

第二种解决方案是使用find命令生成所有文件的列表,并将此列表提供给chmod命令(如@lamgesh所建议)。

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

这两个版本都可以正常工作,只要 find命令很少。第二种解决方案比第一种解决方案看上去更美观并且更具可读性。如果有大量文件,第二个解决方案将返回错误:Argument list too long.

所以我的建议是

  1. chmod -R 755 /opt/lampp/htdocs如果要一次更改所有文件和目录的权限,请使用。
  2. 使用find /opt/lampp/htdocs -type d -exec chmod 755 {} \;如果您正在使用的文件的数量是非常大的。该-type x选项仅搜索特定类型的文件,其中d用于查找目录,f用于文件,l用于链接。
  3. chmod 755 $(find /path/to/base/dir -type d)否则使用
  4. 在任何情况下都最好使用第一个

2

非常简单

在终端中,转到文件管理器。例如:sudo nemo。转到/opt/然后单击属性→权限。然后其他。最后,更改以创建和删除文件,然后读取和写入文件,然后单击应用按钮...然后工作。


sudo nemo是什么?
Vikranth Inti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.