我有一个文件列表,位于不同的文件夹中,名称如下
aaaaaa_bb_cccc_ddddd_ee.jpg
在其中一些中,我需要删除第二个 _ 之前的所有内容,这样它们就变成了
cccc_ddddd_ee.jpg
在其他情况下(已经在单独的文件夹中),我需要删除第三个 _ 之前的所有内容
ddddd_ee.jpg
我知道诸如重命名之类的命令,它使用一些正则表达式,但我不知道这种情况的确切表达式。我怎样才能在Linux终端上做到这一点?
答案1
使用 Perl 重命名实用程序,
$ ls
aaaaaa_bb_cccc_ddddd_ee.jpg
$ rename -n 's/([^_]*_){2}//' *
rename(aaaaaa_bb_cccc_ddddd_ee.jpg, cccc_ddddd_ee.jpg)
$ rename -n 's/([^_]*_){3}//' *
rename(aaaaaa_bb_cccc_ddddd_ee.jpg, ddddd_ee.jpg)
该-n
标志告诉 Rename 输出它将执行的操作。如果删除-n
,则将应用修改。
将*
扩展到当前目录中的每个文件。在上面的示例中,只有一个文件,但 Rename 可以在一次运行中对多个文件进行操作,在这种情况下*
比 shell 循环更快。
s/([^_]*_){2}//
意思是:将文件名中s
出现的每一个([^_]*_){2}
正则表达式替换为空。正则表达式的意思是:任意数量的非下划线,[^_]*
后跟_
重复两次的下划线。
答案2
消除直到第二个_的所有内容
rename -n 's/[^_]*[_][^_]*[_]//' *
消除第三个_之前的所有内容
rename -n 's/[^_]*[_][^_]*[_][^_]*[_]//' *
删除-n
可以有效地更改文件名,而不仅仅是测试。