我在一个文件夹中有一系列文件,文件名中间有一个以_S
( _S1
, S2
, S143
....) 开头的字符串,我需要将其删除/替换为下划线。像这样
file1_S1_R1
file2_S2_R1
file3_S95_R1
file4_S143_R1
应该是
file1_R1
file2_R1
file3_R1
file4_R1
我已经尝试过标准
rename 's/_S*_/_/g' *
命令。然而,什么也没有发生。显然,通配符不适用于我的计算机上的重命名。用反斜杠转义_
(_
无论如何都不是保留字符)或此类技巧没有任何区别。我究竟做错了什么?
答案1
假设您的rename
实用程序是 Perlrename
实用程序(它采用 Perl 表达式,通常是替换表达式,作为其第一个参数):
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file1_S1_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file2_S2_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file3_S95_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file4_S143_R1
$ rename 's/_S\d*_/_/g' *
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file1_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file2_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file3_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file4_R1
您可能会假设您将使用文件名通配模式而不是 Perl 正则表达式,从而导致正则表达式错误。我通过将S*
(匹配零个或多个S
字符)更改为S\d*
(匹配S
后跟零个或多个数字)来修复它。