gpt4 book ai didi

perl - 批量重命名目录中的文件名

转载 作者:行者123 更新时间:2023-11-29 09:16:56 25 4
gpt4 key购买 nike

我有一些文件的名称是这样的:

01_dpm_gsi_182.sl5
02_dpm_devel_gsi_182.sl5
03_DPM_DSI_181.sl5
04_globus_httpd_122.sl5
05_globus_httpd_client_cgi_132.sl5

我怎样才能重命名这些文件,以便我得到类似的东西:

01_dpmgsi_s2011e01.sl5
02_dpmdevelgsi_s2011e02.sl5
....
....

最接近我的建议是这样的:

#!/usr/bin/perl -n

if (/^([^_]+)_(.+)_([^.]+)([.].+)$/) {
my $s = $&;
my $x = $1;
my $y = $2;
my $z = 2011;
my $e = $4;

$y =~ s/_//g;

print "mv $s ${x}_${y}_s${z}e$x$e\n"
}

然后像这样使用它:

# ls | perl -n reName.pl > output
# bash ./output

有没有更好的方法或单行代码来做到这一点,可能使用 sed/awk?干杯!

最佳答案

不需要使用 bash 脚本来 mv 文件,perl 可以做到。下面的脚本使用 File::Copy为了这个目的。我已注释掉执行移动的行,以便可以先使用输入测试脚本。

代码:

use strict;
use warnings;
use v5.10;

#use File::Copy;
my $year = 2011;
for (@ARGV) {
my ($pre, @p) = split /_/;
my $ext = pop @p;
$ext =~ s/.*\./s${year}e$pre./;
my $new = join '_', $pre, (join '', @p), $ext;
say "old: $_";
say "new: $new";
say "------";
#move $_, $new or die $!;
}

用法:

perl script.pl *.sl5

如果您没有 5.10 版本,请将 say 替换为 print 并添加换行符。

输出:

old: 01_dpm_gsi_182.sl5
new: 01_dpmgsi_s2011e01.sl5
------
old: 02_dpm_devel_gsi_182.sl5
new: 02_dpmdevelgsi_s2011e02.sl5
------
old: 03_DPM_DSI_181.sl5
new: 03_DPMDSI_s2011e03.sl5
------
old: 04_globus_httpd_122.sl5
new: 04_globushttpd_s2011e04.sl5
------
old: 05_globus_httpd_client_cgi_132.sl5
new: 05_globushttpdclientcgi_s2011e05.sl5

关于perl - 批量重命名目录中的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8327127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com