我有一个包含一些内容(三个文件和一个文件夹)的文件夹,如下所示:
-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)
cha*_*lie 10
要仅删除文件的可执行状态,请使用:
$ chmod -R a-x+X ui-lightness/
Run Code Online (Sandbox Code Playgroud)
该+X选项被定义为(参见man chmod):
- 仅当文件是目录或已对某些用户具有执行权限时才设置执行权限
因此,小写-x选项首先从所有文件(当然还有目录)中删除可执行状态,然后大写+X选项仅将其设置回目录。
它有一个小缺点:它将可执行状态设置为所有子目录,甚至是那些在chmod调用之前没有设置它的子目录。如果这不是您想要的,只需使用 Keith 的find解决方案。