在 Ubuntu 16.04 中我有几个网站目录/var/www/html/
。
我希望每个目录的所有者与目录的名称相同。
我如何通过目录名称递归地更改目录的所有者?
笔记:
1)我已经为每个目录创建了一个用户,如下所示:
useradd ${domain} --gecos --disabled-password --disabled-login
2)此操作的目的是出于安全原因 - 防止所有目录拥有相同的所有者。
答案1
工作脚本
假设 www-data 是你的 Web 服务器的正确组
使用您喜欢的编辑器输入以下内容chown_www.sh
#!/bin/bash
for directory in `find /var/www/html/ -mindepth 1 -maxdepth 1 -type d`
do
user=$(basename $directory)
chown -R $user:www-data $directory
done
使其可执行
chmod +x /path/to/script/chown_www.sh
并以 root 身份或通过 sudo 执行
sudo /path/to/script/chown_www.sh
免责声明:这没有错误检查来查看目录名称是否是可行的用户(和/或干净的名称)。
解释
最小find
/最大深度为 1 只会找到直接位于其下的目录/var/www/html
- 这就是您想要的。
-type d
万一有一些文件/html
。
然后我们得到目录的名称basename
并执行递归chown
,就像你想要的那样。
免责声明:这是受用户 muclux 启发的,但我的编辑被拒绝了
答案2
我不知道你的计划是否好,但以下脚本可以完成这项工作(使用 sudo 调用)。请注意,你只能使用现有的用户 ID 作为所有者。
#!/bin/bash
cd /var/www
for file in `find html/*`
do
d=`dirname $file`
p=`basename $d`
chown $p:www-data $file
done
该脚本对文件和子目录一视同仁,因此无需递归。
basename (dirname (file)) 为您提供直接“父”目录的名称。
答案3
我假设你下面有 N 个目录/var/www/html
,并且只想(递归地)更改这些顶级目录的所有者,即
/var/www/html/domain1 # -> change owner to "domain1" for this dir and below
/var/www/html/domain2 # -> change owner to "domain2" for this dir and below
/var/www/html/domain3 # -> change owner to "domain3" for this dir and below
如果例如/var/www/html/domain1
有子目录(如public
,,css
)data
,那么他们应该不是属于用户public
等,也属于用户domain1
。
在此前提条件下,以下脚本将起作用(作为用户root
):
#!/usr/bin/env bash
cd /var/www/html
GLOBIGNORE=. # to catch hidden directories
for dir in *; do
test -d $dir && chown -R $dir $dir;
done
答案4
怎么样find
?
find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;
这将简单地查找d
下面的所有目录/var/www/html/
,而不是更下面的目录,并对每个目录执行exec
ute。bash shell 内部是当前处理的目录的路径,是剪切出的目录名称。我添加了上面的命令,以便它会首先打印要执行的每个命令,如果您对结果满意,只需运行它而不使用。chown -R
$0
${0##*/}
echo
chown
echo
如果出于任何原因,你想要或需要采用不同的方法来完成任务,这里有一些替代方案(均经过echo
测试!),其中parallel
一种是最有效的巨大的目录数量:
for i in /var/www/html/*/; do a=${i%/}; echo chown -R "${a##*/}" "$i"; done
for i in /var/www/html/*/; do echo chown -R "$(dirname $i)" "$i"; done
parallel echo chown -R '{=s/\/$//;s/.*\///=}' {} ::: /var/www/html/*/