确保子目录不会受到循环(或查找)的影响

确保子目录不会受到循环(或查找)的影响

请查看这些旨在执行基本相同任务的代码(查找.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 1before来解决这个问题-name。这将停止find递归到给定目录的子目录并强制其停止在顶层。

添加-maxdepth 1find使其工作方式与上面我最后一个实际循环的方式几乎相同。

这两个命令都没有尝试验证找到的.htaccess文件实际上是常规文件而不是目录等。在循环中,您可以通过测试来做到这一点-f,并且在find命令中,您可以通过-type f-exec.

相关内容