如何重命名文件,删除字符第二次或第三次出现之前的所有内容?

如何重命名文件,删除字符第二次或第三次出现之前的所有内容?

我有一个文件列表,位于不同的文件夹中,名称如下

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可以有效地更改文件名,而不仅仅是测试。

相关内容