请查看这些旨在执行基本相同任务的代码(查找.htaccess
网站的主要内容并进行更改):
for dir in "$HOME"/public_html/*.{com,co.il}/; do
if pushd "$dir"; then
chmod 644 .htaccess
popd
fi
done 2>/dev/null
和:
find "$HOME"/public_html/*.{com,co.il} -name ".htaccess" -exec chmod 644 {} \;
这些是否也会影响.htaccess
下每个目录的子目录中的文件public_html
?
答案1
事实上,第一个循环仅考虑您列出的直接目录结构中的文件(当然,填充了通配符)。您列出的命令find
不会将自身限制为任何级别的目录结构,并且可以chmod
在任何目录结构上运行和所有目录树中名为 .htaccess 的文件。
要将find
命令限制为仅其起始目录结构(请注意,您已通过 glob 为其指定了多个起始目录),请添加谓词-maxdepth 1
:
find "$HOME"/public_html/*.{com,co.il} -maxdepth 1 -name ".htaccess" -exec chmod 644 {} \;
答案2
您的第一个代码片段:
for dir in "$HOME"/public_html/*.{com,co.il}/; do
if pushd "$dir"; then
chmod 644 .htaccess
popd
fi
done 2>/dev/null
这可以在不进入和退出目录的情况下重写,如下所示
for dir in "$HOME"/public_html/*.{com,co.il}/; do
chmod 644 "$dir/.htaccess"
done 2>/dev/null
甚至可以缩短(或至少修改)为
for pathname in "$HOME"/public_html/*.{com,co.il}/.htaccess; do
chmod 644 "$pathname"
done 2>/dev/null
如果这些文件不是太多,可以通过以下方式完成
chmod 644 "$HOME"/public_html/*.{com,co.il}/.htaccess 2>/dev/null
这只查看.htaccess
子目录中的文件public_html
,而不是进一步深入目录结构。
请注意,最后两个变体不会尝试chmod
丢失文件。原始循环和我的第一个变体假设给定目录中有.htaccess
文件,而最后两个变体只是循环遍历实际存在的文件。前面的循环让您有机会测试目录是否包含这样的文件(您不会这样做),而后面的命令则假设那里的文件是我们唯一需要关心的文件。chmod
.htaccess
.htaccess
你的第二个代码片段:
find "$HOME"/public_html/*.{com,co.il} -name ".htaccess" -exec chmod 644 {} \;
另一方面,这会查找 ..htaccess
定义的目录中或目录下任何位置的文件"$HOME"/public_html/*.{com,co.il}
。您可以通过添加-maxdepth 1
before来解决这个问题-name
。这将停止find
递归到给定目录的子目录并强制其停止在顶层。
添加-maxdepth 1
到find
使其工作方式与上面我最后一个实际循环的方式几乎相同。
这两个命令都没有尝试验证找到的.htaccess
文件实际上是常规文件而不是目录等。在循环中,您可以通过测试来做到这一点-f
,并且在find
命令中,您可以通过-type f
在-exec
.