如何根据文件是否存在递归执行命令

时间:2014-07-31 23:36:50

标签: linux bash shell

我需要检查文件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。

感谢您的帮助!

3 个答案:

答案 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"
' \;

说明:

  1. find . -name "new.htaccess"以递归方式查找所有“new.htaccess”文件
  2. 对于每个文件f(即./sub/dir/new.htaccess),请计算dir_f(即./sub/dir
  3. 计算新文件new_f(即./sub/dir/.htaccess
  4. 的路径
  5. f移到new_f上方(-f表示“必要时覆盖”)。
  6. 删除同一文件夹中的.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匹配的文件名的结尾部分来获取/*文件的目录。