为什么chmod上的递归模式会做除递归之外的所有操作?

时间:2010-08-12 22:00:56

标签: bash unix centos chmod

chmod -R 775 *.cgi仅更改当前目录中文件的权限,子目录中的文件根本不会被修改。这与简单地执行chmod 775 *.cgi的功能完全相同。我见过人们使用find和诸如此类的解决方案。好的,但是为什么-R模式甚至存在,如果它甚至没有完成任何事情?

5 个答案:

答案 0 :(得分:15)

可能是因为您没有名为*.cgi的目录。请manual

  

-R 递归更改文件模式位。对于命名a的每个文件操作数   目录,chmod将更改文件   目录的模式位和所有   它下面的文件层次结构中的文件。

例如:

$ ls -R
.:
a  a.c  b.c  c.c

./a:
a.c  b.c  sub

./a/sub:
a.c  b.c  
$ chmod -R 444 *.c
$ ls -l
drwxr-xr-x 3 msw msw 4096 2010-08-12 18:07 a
-r--r--r-- 1 msw msw    0 2010-08-12 18:07 a.c
-r--r--r-- 1 msw msw    0 2010-08-12 18:07 b.c
-r--r--r-- 1 msw msw    0 2010-08-12 18:07 c.c
$ : directory a not affected
$ chmod -R u-w a    
$ ls -l a
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 a.c
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 b.c
dr-xr-xr-x 3 msw msw 4096 2010-08-12 18:07 sub
$ ls -l a/sub
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 a.c
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 b.c
$ : got em

答案 1 :(得分:8)

-R告诉chmod递归到作为参数给出的任何目录。

如果你说chmod -R 775 *.cgi,shell会将*.cgi扩展为与该模式匹配的文件列表,并将其作为参数列表传递 - 因此chmod不是*.cgi要求查看其他任何目录。

(它递归到与{{1}}匹配的任何目录 ...)

答案 2 :(得分:6)

要完成你想要的尝试

find . -name '*.cgi' -print0 | xargs -0 chmod 755

此处find生成一个列表,其中包含从当前目录向下结束的.cgi的所有文件,并将该列表传递给xargschmod将{{1}}应用于每个文件

答案 3 :(得分:4)

*.cgi由shell扩展为当前目录中以.cgi结尾的所有文件名列表。然后shell用这个文件名列表调用chmod

chmod查看它从shell获取的所有文件名,更改模式,如果其中一些是目录则会递归。但可能没有一个,所以没有什么可以回复的。

要查找当前目录及其子目录中的所有cgi文件,并在其上运行chmod,您可以这样做:

find . -name '*.cgi' -print0 | xargs -0 chmod 775

答案 4 :(得分:2)

*是内置shell,而-R是命令行选项。因此chmod永远不会将*作为参数。

假设foo0.cgi和foo1.cgi是目录的内容。如果您输入chmod -R o+r *.cgi,则chmod会将'-R','o + r','foo0.cgi'和'foo1.cgi'作为参数。

您可以轻松完成您想要做的事情:

find . -iname '*.cgi' | xargs chmod 755