我需要一种方法来定位以或 其他public_html
结尾的所有子目录.com
顶级域名喜欢.biz
或者.co.il
我可能会列出,在此处文档。
这是我的hereoducmnet,它位于嵌套在循环内的pushd-popd
-语句中:if-fi
for
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
进入目录。