在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在评论中指出,的awk
printf
功能可能是在这种情况下整洁:
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
工具,它允许你在执行实际的文件重命名时也要这样做。
答
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
选项实际重命名
这是如此完美:) – Jerry