我必须制作一个脚本,该脚本将在当前目录中更改一个字符串,并在当前目录中更改所有其他子目录中的不同单词。我要在目录中的所有文件和子目录中的所有文件中用Leonidas替换名称Leo。
为什么此脚本只能执行一次?当我第二次尝试运行它时,它不起作用。
#!/bin/bash
for file in *; do
if [[ -f $file ]] && [[ -w $file ]]; then
sed -i -- 's/Leo/Leonidas/g' "$file"
fi
done
答案 0 :(得分:0)
该脚本为什么不更改子目录中文件的字符串?
如我的评论中所述,*
不会扩展子目录。您可以使用类似find
之类的内容来搜索子目录。
#!/bin/bash
targetdir="$1" # set this to the directory of files you want to change
for file in $(find "$targetdir" -type f); do
if [[ -f $file ]] && [[ -w $file ]]; then
sed -i -- 's/Leo/Leonidas/g' "$file"
fi
done
为什么此脚本只能执行一次?当我第二次尝试运行它时,它不起作用。
因为要在与使用sed
更新的文件所在的目录中运行它。因此,即使您的脚本也会被sed
更新,因为它在Leo
行中包含单词sed -i -- 's/Leo...
。您的脚本不得与您要更新的文件位于同一目录中。
通过这种方式,无需脚本即可达到相同的效果:
find . -type f -writable | xargs -i sed -i 's/Leo/Leonidas/g' {}