我需要批量重命名文件——我浏览的其他问题并不能完全解决我的问题。我的文件的名称是不确定生成的,因此我无法预测它们将被命名为什么。我确实知道他们将以 开始NORMAL
并以 结束-lib*
。我想用一些 string 替换之间的所有内容X
。例如,
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.concordant
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.deletion
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.divergent
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.inversion
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.translocation
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.concordant
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.deletion
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.divergent
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion
| | |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translocation
所以它可能是这种形式rename "s/something/X/"
,但我不知道它应该是什么,因为我不知道如何使用正则表达式。
答案1
有用的 Perl 驱动rename
并不总是在所有发行版上可用。例如,Fedora 和 CentOS(大概还有 RedHat)使用一个基本rename
实用程序来执行基本搜索和替换,仅此而已。
如果您不幸使用其中之一,那么类似以下内容可能会有所帮助:
for oldname in *; do
newname=$(echo "$oldname" | sed -e 's/\(NORMAL\).*\(-lib.*\)/\1X\2/')
mv "$oldname" "$newname"
done
答案2
如果您足够幸运,可以rename
使用,那么以下内容就足够了:
rename 's/(NORMAL).*(-lib)/$1X$2/' *
答案3
有两个不相关的程序称为rename
.在 Debian 及其衍生产品(Ubuntu、Mint 等)上找到的脚本是 Perl 脚本,其第一个参数是将旧名称转换为新名称的 Perl 表达式。使用该脚本,您可以执行以下操作
rename 's/.*-lib/NORMAL_X-lib/' NORMAL_*-lib*
这s
操作员执行一个正则表达式替代品。网上有很多正则表达式教程,例如1。.*-lib
匹配字符串直到最后一次出现-lib
(.*
匹配任何字符串),因此s/.*-lib/NORMAL_X-lib/
将该部分替换NORMAL_blahblah-lib
为NORMAL_X-lib
。
如果您的 Linux 发行版不是源自 Debian,那么该rename
实用程序几乎不适合执行任何实际任务。您可以改用 shell 循环。
for x in NORMAL_*-lib*; do
mv "$x" "NORMAL_X-lib${x##*-lib}"
done
${x##*-lib}
是变量的值x
减去最后一次出现 的部分-lib
。这是标准的参数扩展句法。
这个任务在 zsh 中是最简单的,因为它zmv
功能。输入autoload -U zmv
您的.zshrc
(或在命令行上运行一次),然后运行
zmv 'NORMAL_*-(lib*)' 'NORMAL_X-$1'
答案4
你可以考虑使用环顾四周,就像(?<=NORMAL).*?(?=-lib)
即
$ rename -v -n -- 's/(?<=NORMAL).*?(?=-lib)/X/' *
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion renamed as NORMALX-lib4.insertion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion renamed as NORMALX-lib4.inversion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translation renamed as NORMALX-lib4.translation