在bash中转换日期格式

时间:2016-10-27 13:55:48

标签: linux bash shell awk

我有类似的格式ResultSet FILE_COUNTrs = stmtCFG.executeQuery( "SELECT count(*) from TABLE where MYID = '"+MYID+"';"); FILE_COUNT = FILE_COUNTrs.getString(?????); 的不同文件可以使用bash脚本重命名为backup_2016-26-10_16-30-00所有文件。 请提出一些方法来解决这个问题。

原始文件:

backup_26-10-2016_16:30:00

预期输出:

backup_2016-30-10_12-00-00

4 个答案:

答案 0 :(得分:3)

要仅执行名称转换,您可以使用awk

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

正如fedorqui在评论中指出的那样,awk的{​​{1}}功能在这种情况下可能更整洁:

printf

也就是说,您的特定Linux发行版可能附带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 }' 工具,允许您在执行实际文件重命名时执行相同操作。

答案 1 :(得分:3)

使用基于perl的{​​{1}}命令:

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) 选项

答案 2 :(得分:2)

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

但不确定会更简单

答案 3 :(得分:1)

你也可以这个剧本;

#!/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

例如

user@host:/tmp$ ./test.sh backup_2016-30-10_12-00-00
backup_30-10-2016_12:00:00