6

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

4

5 回答 5

16

可能是因为您没有名为*.cgi. Quoth手册

-R递归更改文件模式位。对于命名目录的每个文件操作数,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
于 2010-08-12T22:03:59.767 回答
10

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

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

(它将递归到任何匹配的目录*.cgi...)

于 2010-08-12T22:06:31.517 回答
7

为了完成你想要的尝试

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

这里find生成.cgi从当前目录向下的所有文件的列表,xargs并将适用chmod于每个文件的列表传递给该列表。

于 2010-08-12T22:08:58.580 回答
4

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

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

要查找当前目录及其子目录中的所有 cgi 文件并chmod在它们上运行,您可以执行以下操作:

find . -name '*.cgi' -print0 | xargs -0 chmod 775
于 2010-08-12T22:09:25.253 回答
3

*是内置的 shell,而 -R 是命令行选项。所以chmod永远不会得到*作为论据。

假设 foo0.cgi 和 foo1.cgi 是目录的内容。如果您键入chmod -R o+r *.cgithenchmod将获得 '-R'、'o+r'、'foo0.cgi' 和 'foo1.cgi' 作为参数。

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

find . -iname '*.cgi' | xargs chmod 755
于 2010-08-12T22:09:49.013 回答