![如果匹配某个关键字,则递归更改文件的名称及其内容](https://linux22.com/image/580301/%E5%A6%82%E6%9E%9C%E5%8C%B9%E9%85%8D%E6%9F%90%E4%B8%AA%E5%85%B3%E9%94%AE%E5%AD%97%EF%BC%8C%E5%88%99%E9%80%92%E5%BD%92%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6%E7%9A%84%E5%90%8D%E7%A7%B0%E5%8F%8A%E5%85%B6%E5%86%85%E5%AE%B9.png)
我可以使用 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