在Bash中批量重命名文件

时间:2017-08-01 06:25:18

标签: bash shell

我在一个目录中有多个文件格式如下,其中开始日期和.log(最后)将相同,但文件名之间将有所不同。

27_07_2017file1vc001vpxd-1605.log
27_07_2017case2vc001vpxd-9169.log
27_07_2017server3vc001vpxd-4640.log
27_07_2017file24vc001vpxd-9170.log
27_07_2017files5vc001vpxd-4641.log

file1vc001vpxd-1605_27_07_2017_1.log
case2vc001vpxd-9169_27_07_2017_1.log
server3vc001vpxd-4640_27_07_2017_1.log
file24vc001vpxd-9170_27_07_2017_1.log
files5vc001vp-4641_27_07_2017_1.log

我有几个不同的文件。请将上面的文件名视为file1,file2,file3,file4,case1,case2,number1,number2 ......等等。所有文件名格式都没有修复“文件”这个词 - 它应该重命名为filename_date_1.log。换句话说,它应该删除日期后的中间名,并保留第一个和日期中间等等

请不要建议使用renamesed命令,因为rename在我的Linux服务器中不起作用且组织不允许我使用sed

1 个答案:

答案 0 :(得分:-1)

使用日志在目录中运行以下命令。

$(ls | sed 's/\([0-9]\{2\}_[0-9]\{2\}_[0-9]\{4\}\)\(.*\)\.log/mv & \2_\1_1.log/')

$> ls
27_07_2017file1vc001vpxd-1605.log
$> $(ls | sed 's/\([0-9]\{2\}_[0-9]\{2\}_[0-9]\{4\}\)\(.*\)\.log/mv & \2_\1_1.log/')
$> ls
file1vc001vpxd-1605_file1vc001vpxd-1605_1.log

编辑:

纯粹的bash解决方案,不使用任何外部工具。

for f in $(ls); do [[ $f =~ ([0-9]{2}_[0-9]{2}_[0-9]{4})(.*)\.log ]] && mv $f "${BASH_REMATCH[2]}_${BASH_REMATCH[1]}_1.log" ; done

它检查每个文件名是否与给定的正则表达式匹配。如果匹配,则执行mv命令。

执行正则表达式匹配时,它会捕获两个匹配的组,因为它们需要稍后使用。

([0-9]{2}_[0-9]{2}_[0-9]{4})dd_dd_dddd格式捕获第一组中的任何内容。 (.*)可以捕获任何内容。

因此正则表达式([0-9]{2}_[0-9]{2}_[0-9]{4})(.*)\.log匹配格式为dd_dd_dddd<anything here>.log的任何文件名。

相关问题