我需要检查文件new.htaccess
是否存在于多个目录中(递归)并执行:
rm .htaccess
rename new.htaccess .htaccess
rm .htpasswd
我认为for循环可能有效,但我不确定语法(我是for循环的noob)。
我认为它应该看起来像这样,但正如我所说我是一个菜鸟,并没有让它正常工作:
for -r new.htaccess in * do {
rm .htaccess
rename new.htaccess .htaccess
rm .htpasswd }
我在Godaddy 4GH共享主机上使用Red Hat linux和BASH v3.2.25。
感谢您的帮助!
答案 0 :(得分:2)
有很多方法可以做到这一点,这是另一个简单的方法:
find . -name new.htaccess -execdir sh -c '
mv new.htaccess .htaccess
rm .htpasswd
' \;
答案 1 :(得分:1)
从起始目录运行:
find . -name "new.htaccess" -exec sh -c '
f="{}"
dir_f=$(dirname "$f")
new_f="$dir_f/.htaccess"
mv -f "$f" "$new_f"
rm -f "$dir_f/.htpasswd"
' \;
说明:
find . -name "new.htaccess"
以递归方式查找所有“new.htaccess”文件f
(即./sub/dir/new.htaccess
),请计算dir_f
(即./sub/dir
)new_f
(即./sub/dir/.htaccess
)f
移到new_f
上方(-f
表示“必要时覆盖”)。.htpasswd
(-f
表示“如果没有.htpasswd则不要抱怨”)答案 2 :(得分:0)
find . -name new.htaccess -print | while read path; do (
cd ${path%/*}
mv new.htaccess .htaccess
rm .htpasswd
)
done
以下是bash
上的${path%/*}
手册中的解释:
${parameter%word}
${parameter%%word}
这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式匹配的尾随部分 参数的扩展值,则扩展的结果是参数的扩展值最短 匹配模式(
%
案例)或最长匹配模式(%%
案例)已删除。如果参数为@
或*
,则为 模式删除操作依次应用于每个位置参数,扩展是结果列表。如果 参数是使用@
或*
下标的数组变量,模式删除操作适用于每个成员 依次是数组,扩展是结果列表。
因此,它通过删除与.htaccess
匹配的文件名的结尾部分来获取/*
文件的目录。