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