我一直试图清理几个盒子上的权限,并一直在搜索 chmod 手册以及我可以处理的所有互联网文档,但都没有任何运气 - 所以我们开始吧。
基本上,我有一个包含许多子目录和文件的目录——并且我想设置以下权限:
对于目录:770 (u+rwx、g+rwx、o-rwx)
对于文件:660(U+rw、g+rw、ax、o-rw)
如果可能的话,我想尝试使用单个递归 chmod 来执行此操作 - 以避免遍历每个目录并逐个设置文件权限。
我想象一定有一种方法可以做到这一点,而不需要编写我自己的 shell 脚本——但我还没有找到任何东西。
我感谢您的帮助!
答案1
我确实发现脚本很有用,因为它通常有助于一次性更改文件和目录权限,并且它们通常是链接的。770 和 660 用于文件服务器上的共享目录,755/644 用于 Web 服务器目录,等等。我在 root 的 bin/ 中保留了一个带有该类型服务器最常用模式的脚本,当不适用通用模式时,只需手动执行查找。
#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ; fi
destdir=$1
dirmode=0770
filemode=0660
YN=no
printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "
read YN
case $YN in
[yY]|[yY][eE][sS])
# change permissions on files and directories.
find $destdir -type f -print0 | xargs -0 chmod $filemode $i
find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;
*) echo "\nBetter safe than sorry I always say.\n" ;;
esac
答案2
不需要脚本。
// 目录:
find . -type d -exec chmod 770 '{}' \;
// 文件:
find . -type f -exec chmod 660 '{}' \;
答案3
就您而言,它可能不必像其他人所说的那样复杂(尽管它确实是一种处理这类事情的好工具)。 模式之间的区别在于执行位。 如果没有任何文件已经设置了执行位,那么您可以像您要求的那样,find
通过一次调用 来完成此操作。chmod
chmod -R u=rwX,g=rwX,o= FILE...
这里的关键是大写字母X
,手册页解释为
仅当文件是目录或某些用户已具有执行权限时才执行/搜索。
因此,如果您的文件尚未设置执行位,则只会为目录设置执行位。
答案4
简洁干净:
chmod 660 $(find . -type f)
chmod 770 $(find . -type d)