如何在 Linux 终端中更改多个文件名并保留名称的变量部分

如何在 Linux 终端中更改多个文件名并保留名称的变量部分

我有数千个带有此正则表达式的文件名:

(sp|li)_(test|train|val)_(loss|acc)_((1e-\d+)|(0[.]0{0,4}1))_curious_\d+_plasticity[.]npy

例如:

li_test_acc_0.01_curious_1_plasticity.npy
li_test_acc_0.0001_curious_1_plasticity.npy
sp_train_loss_1e-05_curious_901_plasticity.npy

我想删除curious并将其替换为plasticity最后,新的名称正则表达式将是:

(sp|li)_(test|train|val)_(loss|acc)_((1e-\d+)|(0[.]0{0,4}1))_plasticity_\d+[.]npy

将名称更改为:

li_test_acc_0.01_plasticity_1.npy
li_test_acc_0.0001_plasticity_1.npy
sp_train_loss_1e-05_plasticity_901.npy

我已经看到很少使用rename这样的解决方案这里。但是这些解决方案没有保留名称的其他部分。你能帮我解决这个问题吗?

答案1

rename如果是“Perl 重命名”(rename在 Debian 和衍生版本中是,但在 Redhat 和衍生版本中是),则解决方案应该有效prename。可以使用以下命令检查[p]rename --version答案:

/usr/bin/rename using File::Rename version 0.20

有了权利rename,那么这是一个简单的问题:

rename -n 's/curious_(\d+)_plasticity\.npy$/plasticity_$1.npy/' *.npy

换句话说

  • 文件名以下列结尾:
    • “好奇的”
    • 下划线
    • 一些数字
    • 另一个下划线
    • “可塑性”
    • “.npy”扩展名
  • 替换“curious”,后面跟着:
    • “可塑性”
    • 下划线
    • 找到的数字组
    • “.npy”扩展名

-n用于试运行,-v实际执行时请移除或替换。

$>>rename -n 's/curious_(\d+)_plasticity\.npy$/plasticity_$1.npy/' *.npy
rename(li_test_acc_0.01_curious_1_plasticity.npy, li_test_acc_0.01_plasticity_1.npy)

答案2

你可以尝试类似

for file in $(ls | grep -e '\(sp\|li\)_\(test\|train\|val\)_\(loss\|acc\)_\(\(1e-[0-9]\+\)\|\(0[.]0\{0,4\}1\)\)_curious_[0-9]\+_plasticity[.]npy'); do mv $file $(echo $file | sed 's/\(.*\)curious\(.*\)_plasticity\(.*\)/\1plasticity\2\3/g'); done

(显然,确切的语法取决于你的shell)。

相关内容