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
选项来执行此操作。