chmod:递归删除“x”权限完全取消权限

Max*_*ams 1 chmod

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

-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
Run Code Online (Sandbox Code Playgroud)

我想为所有用户添加组写入并删除所有用户的可执行状态。我先做文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。现在,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
$ 
Run Code Online (Sandbox Code Playgroud)

我的第一反应是有点恐慌。但是,重新添加 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
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这里发生了什么?以及如何删除可执行状态而不破坏所有内容?如果相关,这是在 ubuntu 9.10 中。

干杯,最大

Kei*_*ith 10

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

chmod -R a-x ui-lightness/*
Run Code Online (Sandbox Code Playgroud)

  • 是的。你真的应该使用 `find 。-type f -exec chmod -x {} \;` 仅选择常规文件。 (6认同)

cha*_*lie 10

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

$ chmod -R a-x+X ui-lightness/
Run Code Online (Sandbox Code Playgroud)

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

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

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

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