chmod:以递归方式删除“x”权限会完全破坏权限

chmod:以递归方式删除“x”权限会完全破坏权限

我有一个文件夹,其中有一些内容(三个文件和一个文件夹),如下所示:

-rwxr-xr-x 1 max max 14504 2011-05-31 16:55 main.css
-rwxr-xr-x 1 max max  2504 2011-05-31 16:55 reset.css
-rwxr-xr-x 1 max max   916 2011-05-31 16:55 scaffold.css
drwxrwxr-x 3 max max  4096 2011-05-31 16:55 ui-lightness

我想为所有这些文件添加组写入权限,并删除所有用户的可执行状态。我首先处理这些文件:

$ chmod g+w main.css reset.css scaffold.css 
$ chmod a-x main.css reset.css scaffold.css 
$ ls -l
total 28
-rw-rw-r-- 1 max max 14504 2011-05-31 16:55 main.css
-rw-rw-r-- 1 max max  2504 2011-05-31 16:55 reset.css
-rw-rw-r-- 1 max max   916 2011-05-31 16:55 scaffold.css
drwxrwxr-x 3 max max  4096 2011-05-31 16:55 ui-lightness

到目前为止一切顺利。现在,ui-lightness 文件夹已经有了组写入权限,所以我只想从其中删除 exe 状态以及其中的所有文件和子文件夹。

$ ls -l ui-lightness/
total 40
drwxrwxr-x 2 max max  4096 2011-05-31 16:55 images
-rwxrwxr-x 1 max max 34146 2011-05-31 16:55 jquery-ui-1.8.11.custom.css

$ chmod -R a-x ui-lightness/
chmod: cannot access `ui-lightness/jquery-ui-1.8.11.custom.css': Permission denied
chmod: cannot access `ui-lightness/images': Permission denied

$ ls -l ui-lightness/
ls: cannot access ui-lightness/jquery-ui-1.8.11.custom.css: Permission denied
ls: cannot access ui-lightness/images: Permission denied
total 0
d????????? ? ? ? ?                ? images
-????????? ? ? ? ?                ? jquery-ui-1.8.11.custom.css
$ 

我的第一反应是有点恐慌。但是,重新添加 x 状态就可以解决问题!

$ chmod -R a+x ui-lightness/

$ ls -l ui-lightness/
total 40
drwxrwxr-x 2 max max  4096 2011-05-31 16:55 images
-rwxrwxr-x 1 max max 34146 2011-05-31 16:55 jquery-ui-1.8.11.custom.css

有人能解释一下这是怎么回事吗?我该如何在不破坏一切的情况下删除可执行状态?如果相关的话,这是在 ubuntu 9.10 中。

欢呼吧,马克斯

答案1

递归 chmod 的第一个参数是目录本身。您删除了目录上的 x 位,使其不再可搜索(这就是 x 位对目录的作用)。然后 chmod 程序无法再在该目录内搜索,并且您会收到权限错误。请尝试以下操作。

chmod -R a-x ui-lightness/*

答案2

要仅删除文件的可执行状态,请使用:

$ chmod -R a-x+X ui-lightness/

+X选项定义(见man chmod)为:

  • 仅当文件是目录或某些用户已具有执行权限时才设置执行权限

因此,小写-x选项首先从所有文件(当然还有目录)中删除可执行状态,然后大写+X选项仅为目录将其设置回来。

它有一个小缺点:它将可执行状态设置为全部子目录,甚至那些在调用之前没有设置它的子目录chmod。如果这不是你想要的,只需使用 Keith 的find解决方案。

相关内容