使用 rename 重命名多个文件

使用 rename 重命名多个文件

我需要批量重命名文件——我浏览的其他问题并不能完全解决我的问题。我的文件的名称是不确定生成的,因此我无法预测它们将被命名为什么。我确实知道他们将以 开始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-libNORMAL_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

相关内容