【问题标题】:Why this bash script is not running? [duplicate]为什么这个 bash 脚本没有运行? [复制]
【发布时间】:2019-04-21 23:06:40
【问题描述】:

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

我有两个问题:

  1. 为什么这个脚本没有改变子目录中文件的字符串?

  2. 为什么这个脚本只能执行一次?当我尝试第二次运行它时,它不起作用。

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

【问题讨论】:

标签: string bash shell terminal


【解决方案1】:

为什么这个脚本没有改变子目录文件中的字符串?

正如我在评论中提到的,* 不会扩展子目录。您可以使用 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 更新,因为它在sed -i -- 's/Leo... 行中包含单词Leo。您的脚本不得与您尝试更新的文件位于同一目录中。

顺便说一句,不用脚本也能达到同样的效果:

find . -type f -writable | xargs -i sed -i 's/Leo/Leonidas/g' {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2018-12-18
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多