使用名称模式 *.[a-z0-9].bundle.* 重命名所有文件,以用给定字符串替换 [a-z0-9]

Rename all files with the name pattern *.[a-z0-9].bundle.*, to replace the [a-z0-9] with a given string

在使用 Angular 2 CLI 构建应用程序时,我得到了命名的输出,例如:

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

等等

我想要做的是创建一个 bash 脚本来重命名文件,用一些给定的通用字符串替换前两个 . 之间的数字。尝试了一些东西,包括 sed,但我无法让它们工作。任何人都可以建议一个 bash 脚本来让它工作吗?

纯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 - 添加 -vimv-v = 显示重命名的内容; -i = 覆盖前提示 (man page)。

在纯 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

简短、强大且高效:

使用这个 () 工具。并使用 Perl 正则表达式:

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

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