为什么此bash脚本未运行?

时间:2018-11-19 14:53:06

标签: string bash shell terminal

我必须制作一个脚本,该脚本将在当前目录中更改一个字符串,并在当前目录中更改所有其他子目录中的不同单词。我要在目录中的所有文件和子目录中的所有文件中用Leonidas替换名称Leo。

我有两个问题:

  1. 为什么此脚本未更改子目录中文件的字符串?
  2. 为什么此脚本只能执行一次?当我第二次尝试运行它时,它不起作用。

    #!/bin/bash
    
    for file in *; do
    if [[ -f $file ]] && [[ -w $file ]]; then
        sed -i -- 's/Leo/Leonidas/g' "$file"
    fi
    done
    

1 个答案:

答案 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' {}