chmod -R 775 *.cgi
仅更改当前目录中文件的权限,子目录中的文件根本不会被修改。这与简单地做的功能完全相同chmod 775 *.cgi
。我见过人们使用诸如 withfind
和诸如此类的解决方案。好的很好,但是如果 -R 模式甚至没有完成任何事情,为什么还要存在呢?
5 回答
可能是因为您没有名为*.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
-R
告诉chmod
递归到作为参数给出的任何目录。
如果您说chmod -R 775 *.cgi
,shell 将扩展*.cgi
为与该模式匹配的文件列表,并将其作为参数列表传递 - 因此chmod
不会被要求查看任何其他目录。
(它将递归到任何匹配的目录*.cgi
...)
为了完成你想要的尝试
find . -name '*.cgi' -print0 | xargs -0 chmod 755
这里find
生成.cgi
从当前目录向下的所有文件的列表,xargs
并将适用chmod
于每个文件的列表传递给该列表。
*.cgi
由您的 shell 扩展为当前目录中所有以 . 结尾的文件名的列表.cgi
。然后 shellchmod
用这个文件名列表调用。
chmod
查看它从 shell 获得的所有文件名,更改模式,如果其中一些是目录,则会递归。但可能它们都不是,所以没有什么可以递归的。
要查找当前目录及其子目录中的所有 cgi 文件并chmod
在它们上运行,您可以执行以下操作:
find . -name '*.cgi' -print0 | xargs -0 chmod 775
*
是内置的 shell,而 -R 是命令行选项。所以chmod
永远不会得到*
作为论据。
假设 foo0.cgi 和 foo1.cgi 是目录的内容。如果您键入chmod -R o+r *.cgi
thenchmod
将获得 '-R'、'o+r'、'foo0.cgi' 和 'foo1.cgi' 作为参数。
您想要做的事情可以轻松完成:
find . -iname '*.cgi' | xargs chmod 755