我有数千个带有此正则表达式的文件名:
(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)。