7.9 递归地修改权限

chmod -R

到目前为止,或许你已经注意到很多Linux命令可以递归地应用于文件和目录,chmod命令也不例外。使用-R(或--recursive)选项能够在短时间内修改数百个文件系统对象的权限,只是要确保你确实想要这么做。

  1. $ pwd
  2. /home/scott/pictures/libby
  3. $ ls -lF
  4. drwxrw---- 2 scott scott ... by_pool/
  5. -rw-r--r-- 1 scott scott ... libby_arrowrock.jpg
  6. -rw-r--r-- 1 scott scott ... libby.jpg
  7. drwxrw---- 2 scott scott ... on_floor/
  8. $ ls -l *
  9. -rw-r--r-- 1 scott scott ... libby_arrowrock.jpg
  10. -rw-r--r-- 1 scott scott ... libby.jpg
  11. by_pool:
  12. -rw-r--r-- 1 scott scott ... libby_by_pool_02.jpg
  13. -rwxr-xr-x 2 scott scott ... lieberman_pool.jpg
  14. on_floor:
  15. -rw-r--r-- 1 scott scott ... libby_on_floor_01.jpg
  16. -rw-r--r-- 1 scott scott ... libby_on_floor_02.jpg
  17. $ chgrp -R family *
  18. $ chmod -R 660 *
  19. chmod: 'by_pool': Permission denied
  20. chmod: 'on_floor': Permission denied

Permissin denied?”这是怎么了?看看表7-2。如果文件是可执行的,那么它就可以作为程序来运行;但目录也必须是可执行的,才能允许用户访问其内部,读取它的文件和子目录。上面运行的chmod -R 660 *命令删除了所有内容(包括文件和目录)的x权限。当chmod命令报告它已经完成执行时,因为它不能读取目录中的内容(这些目录不再是可执行的),所以不能成功完成操作。

那应该怎么办呢?还真没有一个简单的答案。可以使用通配符来运行chmod命令,让它只修改特定类型的文件,如下所示:

  1. $ chmod -R 660 *.jpg

这个命令修改的只是图像,而不是目录,所以不会有任何问题。但是如果文件类型不止一种,这样的操作很快就会变得乏味,不得不为每种文件都运行一次chmod命令。

如果子目录里面还有很多子目录,或者需要处理的文件太多,使用find命令会更好。用find命令先找出所有文件(不是目录),然后再修改它们的权限。第10章将详细介绍这个命令的使用方法。

需要特别注意的是,当递归地修改权限时,一定要小心。或许你得到的结果并不是自己原来想要的,偶尔还会造成无法访问某些文件或子目录。