【问题标题】:Bash rename files removing random string between specific stringsBash重命名文件删除特定字符串之间的随机字符串
【发布时间】:2016-08-19 00:38:04
【问题描述】:

我想重命名(在 bash 中)以特定字符串 'foo' 开头的文件列表,以未指定长度的随机字符串 'random1' 继续,并以另一个已知字符串 'bar' 继续。基本上来自“foo_random1_bar_random2”,我想要“foo_bar_random2”。我知道如何使用 sed 删除特定字符串,但不知道特定字符串之间长度未知的字符串。

【问题讨论】:

    标签: string bash file rename


    【解决方案1】:

    使用 BASH 字符串替换:

    f='foo_random1_bar_random2'
    echo "${f/*bar/foo_bar}"
    

    PS:根据下面的cmets,如果bar之前有下划线那么最好使用:

    echo "${f/*_bar/foo_bar}"
    

    输出:

    foo_bar_random2
    

    mv 用作:

    for f in foo_*bar_*; do
       mv -i "$f" "${f/*_bar/foo_bar}"
    done
    

    【讨论】:

    • 这会在 foo_random1_bar_randombar2 上中断
    • 我在示例中没有看到,OP 提供了。如果有这样的可能,我会调整它。
    • "random" 对我来说似乎是相当广泛的输入;-)
    • "${s/*_bar/foo_bar}" 很容易处理它,但 OP 没有指定下划线将始终存在于 bar 之前,正如您在回答中所假设的那样。
    • 但这不是重点。重点是${f//}只能对*做贪婪匹配。
    【解决方案2】:
    for i in foo_*_bar_*
    do
        j=$(echo "$i"|sed -e 's/foo_.*_bar_\(.*\)/foo_bar_\1/')
        echo mv "$i" "$j"
    done
    

    这显示了mv 命令的列表。一旦您对命令感到满意,请删除 echo 之前的 mv 以便它们将被执行。

    【讨论】:

      【解决方案3】:

      如果您安装了rename 工具,您可以这样做

      rename 's/foo_.*_bar/foo_bar/' files
      

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 2018-05-15
        • 2022-12-05
        • 1970-01-01
        • 2016-08-30
        • 2020-05-24
        • 1970-01-01
        • 2013-03-03
        • 2017-10-24
        相关资源
        最近更新 更多