我在一个目录中有多个文件格式如下,其中开始日期和.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。换句话说,它应该删除日期后的中间名,并保留第一个和日期中间等等
请不要建议使用rename
和sed
命令,因为rename
在我的Linux服务器中不起作用且组织不允许我使用sed
答案 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
的任何文件名。