如果匹配某个关键字,则递归更改文件的名称及其内容

如果匹配某个关键字,则递归更改文件的名称及其内容

我可以使用 sed 递归地在一堆文件中查找和替换字符串。如下所示:

find -name  "*.py"  -not \( -name .svn -prune \) -type f -print0  | xargs
-0  sed -i 's/cat/dog/g'

但是有没有办法在文件内部和实际文件名中搜索字符串?

如果在文件名中找到该字符串,则用新字符串替换文件名中的字符串。

如果字符串在实际文件中,则用新字符串替换该字符串。

当然,还要进行递归搜索。

有任何想法吗?

答案1

我不知道如何一次性完成此操作,但它可以很容易地作为一个小脚本来完成,例如(经过轻度测试):

find -name  "*.py"  -not \( -name .svn -prune \) -type f -print0 \
| while read -r -d $'\0' filename; do
    sed -i 's/cat/dog/g' "$filename"
    echo "$filename" | grep -q "cat" \
    && mv "$filename" "${filename/cat/dog}"
  done

相关内容