在使用 Angular 2 CLI 构建应用程序时,我得到了命名的输出,例如:
inline.d41d8cd.bundle.js
main.6d2e2e89.bundle.js
等等
我要做的是创建一个 bash 脚本来重命名文件,用.
一些给定的通用字符串替换前两个之间的数字。尝试了一些东西,包括 sed,但我无法让它们工作。任何人都可以建议一个 bash 脚本来让它工作吗?
在使用 Angular 2 CLI 构建应用程序时,我得到了命名的输出,例如:
inline.d41d8cd.bundle.js
main.6d2e2e89.bundle.js
等等
我要做的是创建一个 bash 脚本来重命名文件,用.
一些给定的通用字符串替换前两个之间的数字。尝试了一些东西,包括 sed,但我无法让它们工作。任何人都可以建议一个 bash 脚本来让它工作吗?
纯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 ) 工具。并使用Perl 正则表达式:
rename 's/\.\X{4,8}\./.myString./' *.js
或者
rename 's/\.\X+\./.myString./' *.js
纯 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>
不包括点 ( [^.]
)(参见手册页)。替换.${generic_string}.
用您想要的任何通用字符串替换它。除此之外,双引号以防你有空格,你就在那里!
编辑感谢 F. Hauri - 添加-vi
到mv
. -v
= 显示正在重命名的内容;-i
= 覆盖前提示(手册页)。