在此处文档重定向/附加行中使用正则表达式来定位特定的目录“集”

在此处文档重定向/附加行中使用正则表达式来定位特定的目录“集”

我需要一种方法来定位以或 其他public_html结尾的所有子目录.com顶级域名喜欢.biz或者.co.il我可能会列出,在此处文档

这是我的hereoducmnet,它位于嵌套在循环内的pushd-popd-语句中:if-fifor

for dir in "$HOME"/public_html/*/; do
    if pushd "$dir"; then
        cat <<-"EOF" >> "$HOME"/public_html/ALL_DOT_COM|ALL_DOT_BIZ/.htaccess

           Apache_directive_set_1

           Apache_directive_set_2

           popd
        EOF
    fi
done 2>myErrors.txt

有没有办法结合正则表达式来实现这一点,直接在heredocument重定向/追加行(在哪里ALL_DOT_COM|ALL_DOT_BIZ)内?

答案1

我假设您想附加到.htaccess所有目录中$HOME/public_html/foo.com/,例如$HOME/public_html/bar.biz/等。

您的for循环已经管理处理所有目录,问题是调整 glob 以匹配所需的结尾:

for dir in "$HOME"/public_html/*.{com,biz,co.il}/; do
    cat <<-"EOF" >> "$dir"/.htaccess
        Apache directives...
        ...
    EOF
done 2>myErrors.txt

似乎没有任何需要cd,因为dir已经包含目录的完整路径。

上面的内容当然只匹配列出的顶级域名。 (我不确定这是否是您想要的,因为您写了“或其他 TLD”。)如果您不关心目录名称上有哪个 TLD,则只需使用.../public_html/*/, 或.../public_html/*.*/,尽管这仍然假设没有其他内容在那里。 (但是,列出全部TLD 有点尴尬,他们可能会想出更多......)

答案2

用于tee -a附加到多个文件,以及大括号扩展。

我也不认为实际上需要循环,就像tee一次写入多个文件的工作一样。

cat <<-"EOF" | tee -a "$HOME"/public_html/*.{com,biz,co.il}/.htaccess
       Apache_directive_set_1
       Apache_directive_set_2
EOF

字符串

"$HOME"/public_html/*.{com,biz,co.il}/.htaccess

将扩展为

/home/something/public_html/*.com/.htaccess /home/something/public_html/*.biz/.htaccess /home/something/public_html/*.co.il/.htaccess

然后 glob 将根据适当的子目录进行匹配工作。

如果存在 glob 可能不匹配任何内容的风险,您可能还应该nullglob在以下位置设置 shell 选项bash

shopt -s nullglob

设置此选项后,与任何现有文件名都不匹配的全局模式将扩展为空字符串。


如果模式"$HOME"/public_html/*.{com,biz,co.il}/.htaccess扩展为太长的字符串,则运行时可能会出现问题tee。在这种情况下你需要循环:

for dir in "$HOME"/public_html/*.{com,biz,co.il}/
do
    cat <<-"EOF" >>"$dir/.htaccess"
           Apache_directive_set_1
           Apache_directive_set_2
    EOF
done

但仍然不需要cd进入目录。

相关内容