在bash

问题描述:

转换日期格式我有格式backup_2016-26-10_16-30-00类似的不同的文件是有可能使用bash脚本重命名为backup_26-10-2016_16:30:00的所有文件。 请提出一些方法来解决这个问题。在bash

原始文件:

backup_2016-30-10_12-00-00

预期输出:

backup_30-10-2016_12:00:00

只执行名称转换,你可以使用awk

echo 'backup_2016-30-10_12-00-00' | 
    awk -F'[_-]' '{ print $1 "_" $3 "-" $4 "-" $2 "_" $5 ":" $6 ":" $7 }' 

由于fedorqui在评论中指出,的awkprintf功能可能是在这种情况下整洁:

echo 'backup_2016-30-10_12-00-00' | 
    awk -F'[_-]' '{ printf "%s_%s-%s-%s_%s:%s:%s\n", $1,$3,$4,$2,$5,$6,$7 }' 

这就是说,你的特定的Linux发行版可能会与rename工具,它允许你在执行实际的文件重命名时也要这样做。

+1

这是如此完美:) – Jerry

rename是这个任务

$ rename 's/_(\d{4})-(\d\d-\d\d)_(\d\d)-(\d\d)-(\d\d)$/_$2-$1_$3:$4:$5/' backup_2016-30-10_12-00-00 

但不知道会更简单

也可以将此脚本;

#!/bin/bash 
fileName=$1 
prefix=$(echo ${fileName} | cut -d _ -f1) 
date=$(echo ${fileName} | cut -d _ -f2) 
time=$(echo ${fileName} | cut -d _ -f3) 

year=$(echo ${date} | cut -d - -f1) 
day=$(echo ${date} | cut -d '-' -f2) 
month=$(echo ${date} | cut -d '-' -f3) 

formatedTime=$(echo $time | sed 's/-/:/g') 

formatedDate=$day"-"$month"-"$year 

formatedFileName=$prefix"_"$formatedDate"_"$formatedTime 

echo $formatedFileName 

例如;

[email protected]:/tmp$ ./test.sh backup_2016-30-10_12-00-00 
backup_30-10-2016_12:00:00 

perl基于rename命令:

$ touch backup_2016-30-10_12-00-00 backup_2016-26-10_16-30-00 

$ rename -n 's/(\d{4})-([^_]+)_(\d+)-(\d+)-/$2-$1_$3:$4:/' backup* 
rename(backup_2016-26-10_16-30-00, backup_26-10-2016_16:30:00) 
rename(backup_2016-30-10_12-00-00, backup_30-10-2016_12:00:00) 

删除-n选项实际重命名