CHMOD - 对文件和目录应用不同的权限

Sko*_*one 14 permissions chmod

我一直在尝试清理几个盒子的权限,并且一直在搜索 chmod 人以及我处理的所有互联网文档,但没有任何运气 - 所以我们开始了。

基本上,我有一个包含许多子目录和文件的目录——我想设置以下权限:

对于目录:770(u+rwx、g+rwx、o-rwx)

对于文件:660(U+rw、g+rw、ax、o-rw)

如果可能,我想尝试使用单个递归 chmod 来执行此操作 - 以避免递归遍历每个目录并设置逐个文件的权限。

我想必须有一种方法可以在不编写自己的 shell 脚本的情况下做到这一点——但我找不到任何东西。

我感谢您的帮助!

Sun*_*nny 24

不需要脚本。

// 目录:

find . -type d -exec chmod XXX {} \;
Run Code Online (Sandbox Code Playgroud)

// 文件:

find . -type f -exec chmod XXX {} \;
Run Code Online (Sandbox Code Playgroud)


Mik*_*uno 19

在您的情况下,它可能不必像其他人所做的那样复杂(尽管find通常确实是此类事情的好工具)。模式之间的区别在于执行位。如果没有文件已经设置了执行位,那么您可以chmod按照您的要求在一次调用中完成。

chmod -R u=rwX,g=rwX,o= FILE...
Run Code Online (Sandbox Code Playgroud)

这里的关键是大写字母X,手册页将其解释为

仅当文件是目录或已对某些用户具有执行权限时才执行/搜索。

因此,如果您的文件尚未设置执行位,则只会为目录设置。


iPa*_*ulo 11

我确实发现了一个有用的脚本,因为它通常可以一次性更改文件和目录权限,并且它们通常是链接的。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
Run Code Online (Sandbox Code Playgroud)


小智 6

我发现至少在我的用例中,使用rsync将目录复制到自身比chmod直接使用来自find.

rsync -rpt --chmod=D770,F660 . .
Run Code Online (Sandbox Code Playgroud)

如果您想将 a 添加chown到同一操作,也rsync可以使用该--chown=user:group选项来执行此操作。