7.9 递归地修改权限
chmod -R
到目前为止,或许你已经注意到很多Linux命令可以递归地应用于文件和目录,chmod
命令也不例外。使用-R
(或--recursive
)选项能够在短时间内修改数百个文件系统对象的权限,只是要确保你确实想要这么做。
$ pwd
/home/scott/pictures/libby
$ ls -lF
drwxrw---- 2 scott scott ... by_pool/
-rw-r--r-- 1 scott scott ... libby_arrowrock.jpg
-rw-r--r-- 1 scott scott ... libby.jpg
drwxrw---- 2 scott scott ... on_floor/
$ ls -l *
-rw-r--r-- 1 scott scott ... libby_arrowrock.jpg
-rw-r--r-- 1 scott scott ... libby.jpg
by_pool:
-rw-r--r-- 1 scott scott ... libby_by_pool_02.jpg
-rwxr-xr-x 2 scott scott ... lieberman_pool.jpg
on_floor:
-rw-r--r-- 1 scott scott ... libby_on_floor_01.jpg
-rw-r--r-- 1 scott scott ... libby_on_floor_02.jpg
$ chgrp -R family *
$ chmod -R 660 *
chmod: 'by_pool': Permission denied
chmod: 'on_floor': Permission denied
“Permissin denied
?”这是怎么了?看看表7-2。如果文件是可执行的,那么它就可以作为程序来运行;但目录也必须是可执行的,才能允许用户访问其内部,读取它的文件和子目录。上面运行的chmod -R 660 *
命令删除了所有内容(包括文件和目录)的x
权限。当chmod
命令报告它已经完成执行时,因为它不能读取目录中的内容(这些目录不再是可执行的),所以不能成功完成操作。
那应该怎么办呢?还真没有一个简单的答案。可以使用通配符来运行chmod命令,让它只修改特定类型的文件,如下所示:
$ chmod -R 660 *.jpg
这个命令修改的只是图像,而不是目录,所以不会有任何问题。但是如果文件类型不止一种,这样的操作很快就会变得乏味,不得不为每种文件都运行一次chmod
命令。
如果子目录里面还有很多子目录,或者需要处理的文件太多,使用find
命令会更好。用find
命令先找出所有文件(不是目录),然后再修改它们的权限。第10章将详细介绍这个命令的使用方法。
需要特别注意的是,当递归地修改权限时,一定要小心。或许你得到的结果并不是自己原来想要的,偶尔还会造成无法访问某些文件或子目录。