请查看这些旨在完成基本相同任务的代码(找到.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
?
事实上,第一个循环只考虑您列出的直接目录结构中的文件(当然,填充了通配符)。您列出的
find
命令不限于任何级别的目录结构,并且会在目录树中名为 .htaccess 的chmod
任何和所有文件上运行。要将
find
命令仅限于它开始的目录结构(请注意您已经通过 glob 给定了多个起始目录),请添加-maxdepth 1
谓词:你的第一个代码片段:
这可以在不改变进出目录的情况下重写,因为
甚至将其缩短(或至少修改)为
其中,如果没有太多这些文件,可以用
这只会查看 的
.htaccess
子目录中的文件public_html
,而不会进一步查看目录结构。请注意,最后两个变体不会尝试
chmod
丢失文件。原始循环和我的第一个变体假定给定目录中有.htaccess
文件chmod
,而最后两个变体只是循环.htaccess
实际存在的文件。前面的循环让您有机会测试目录是否包含这样的文件(您不会这样做),而后面的命令假定那里的.htaccess
文件是我们唯一需要关心的文件。你的第二个代码片段:
另一方面,这会在.
.htaccess
定义的目录中或目录下的任何位置查找文件"$HOME"/public_html/*.{com,co.il}
。您可以通过添加-maxdepth 1
before来解决这个问题-name
。这将停止find
递归到给定目录的子目录并强制它停止在顶层。添加
-maxdepth 1
到find
使它的工作方式与我上面最后一个实际循环几乎相同。这两个命令都不会尝试验证找到的
.htaccess
文件实际上是常规文件而不是目录等。在你的循环中,你可以通过-f
测试来做到这一点,而在find
命令中,你可以通过-type f
在-exec
.