重命名名为pattern *。[a-z0-9] .bundle。*的所有文件,用给定的字符串替换[a-z0-9]

时间:2016-12-13 13:51:14

标签: bash shell glob file-rename angular2-cli

使用Angular 2 CLI构建应用程序时,我会获得名为的输出,例如:

inline.d41d8cd.bundle.js
main.6d2e2e89.bundle.js

我要做的是创建一个重命名文件的bash脚本,将前两个.之间的数字替换为一些给定的通用字符串。尝试过一些事情,包括sed,但我无法让它们发挥作用。任何人都可以建议使用bash脚本来实现这个功能吗?

3 个答案:

答案 0 :(得分:2)

bash regEx使用=~变量(从bash 3.0开始支持)

#!/bin/bash

string_to_replace_with="sample"

for file in *.js
do
    [[ $file =~ \.([[:alnum:]]+).*$ ]] && string="${BASH_REMATCH[1]}" 
    mv -v "$file" "${file/$string/$string_to_replace_with}"
done

对于您的给定输入文件,运行脚本

$ bash script.sh
inline.d41d8cd.bundle.js -> inline.sample.bundle.js
main.6d2e2e89.bundle.js -> main.sample.bundle.js

答案 1 :(得分:2)

简短,强大且高效:

使用此()工具。并使用 Perl正则表达式

rename 's/\.\X{4,8}\./.myString./' *.js

rename 's/\.\X+\./.myString./' *.js

答案 2 :(得分:1)

纯粹的bash选项:

shopt -s extglob    # so *(...) will work
generic_string="foo"   # or whatever else you want between the dots
for f in *.bundle.js ; do
    mv -vi "$f" "${f/.*([^.])./.${generic_string}.}"
done

关键是替换${f/.*([^.]./.${generic_string}.}。模式/.*([^.])./与第一次出现的.<some text>.匹配,其中<some text>不包含点([^.])(请参阅man page)。替换.${generic_string}.将替换为您想要的任何通用字符串。除此之外,如果你有空格,请加上双引号,而且你就是这样!

修改感谢F. Hauri - 将-vi添加到mv-v =显示正在重命名的内容; -i =覆盖前提示(man page)。