Board logo

标题: 【已解决】20元求助,linux下用文件名给时间date赋值 [打印本页]

作者: sysclock    时间: 2019-5-21 22:21     标题: 【已解决】20元求助,linux下用文件名给时间date赋值

本帖最后由 sysclock 于 2019-5-22 11:49 编辑

1、每个小时产生一个文件,文件名的格式如:20190521133322.919753520-beijing32.dat
这个文件名其中的2019 05 21 13 33 22分别是年月日时分秒;

2、写一个小脚本,通过从文件名中提取年月日时分秒等信息,给嵌入式cpu的赋值(命令是: date  -s "2019-05-21"和date -s "13:13:30")

3、已经用cron实现了定时操作,现在只需要一个脚本实现从文件名中提取,并date赋值

=============================================
ps  下面的这几个命令嵌入式linux支持
我自己简单写了一下,搞不定,特来求教,谢谢
ls /tmp/*.dat >t

awk -F "/" '{print $3}' t

awk -F "/" '{a=index($3,".");print substr($3,1,a-1)}' t >t1
awk -F "/" '{a=index($3,".");$year=substr($3,1,a-1)}' t >t1
作者: amwfjhh    时间: 2019-5-22 00:29

没看明白,有没有环境截图,命令回显输出结果之类的,才好作样本分析。
作者: sysclock    时间: 2019-5-22 06:45

本帖最后由 sysclock 于 2019-5-22 06:47 编辑

回复 2# amwfjhh

不好意思,昨天晚上写得太潦草。
    重新编辑了一下需求,您看看现在我写明白了没?
谢谢~
作者: amwfjhh    时间: 2019-5-22 08:05

ls回显贴出来看下什么样子,是否记录唯一?
date命令应该有一步到位的更改,查下帮助
作者: sysclock    时间: 2019-5-22 08:07

本帖最后由 sysclock 于 2019-5-22 08:32 编辑

回复 4# amwfjhh


1、    ls回显示的结果如下:
/tmp/20190521133322.919753520-beijing32.dat

root@testGis:~# ls /tmp/*.dat
/tmp/20190521133322.919753520-beijing32.dat

2、记录可能有最多不超过511个文件,请用时间最新的一个
这个文件,是我按了一下按键,cpu生成的。这个时间是来自gps的,现在想用这个时间,同步cpu的时间。原来目录下已经有一些文件了。

root@testGis:~# ls /tmp/*.dat
/tmp/20190521133322.919753520-beijing32.dat
/tmp/20190522002653.783192675-beijing32.dat
/tmp/20190522002655.703093740-beijing32.dat
/tmp/20190522002657.635708240-beijing32.dat


3、我在命令行下手动操作,如下:

root@testGis:~# date -s "2019-05-12"
Sun May 12 00:00:00 UTC 2019
root@testGis:~# date -s "13:33:22"
Sun May 12 13:33:22 UTC 2019

4、现在需要一个脚本,把手动操作,改为cron控制下的自动操作。

5、系统内有awk、sed命令
谢谢~
作者: zaqmlp    时间: 2019-5-22 09:07

  1. ls /tmp/*.dat >t
  2. d=`awk -F '/' 'END{print substr($3,1,4)"-"substr($3,5,2)"-"substr($3,7,2)}' t`
  3. t=`awk -F '/' 'END{print substr($3,9,2)":"substr($3,11,2)":"substr($3,13,2)}' t`
  4. date -s $d
  5. date -s $t
复制代码

作者: amwfjhh    时间: 2019-5-22 09:07

本帖最后由 amwfjhh 于 2019-5-22 09:19 编辑
  1. #!/bin/bash
  2. for i in `ls /tmp/*.dat | sort -r`
  3. do
  4.         strFile=${i##*/}
  5.         ret=`echo $strFile | grep "[0-9]\{14\}\..*$"`
  6.         if [ -z $ret ]
  7.         then
  8.                 continue
  9.         else
  10.                 echo $ret
  11.                 echo date -s "${strFile:0:4}-${strFile:4:2}-${strFile:6:2}"
  12.                 echo date -s "${strFile:8:2}:${strFile:10:2}:${strFile:12:2}"
  13.                 break
  14.         fi
  15. done
复制代码
执行时把date前面的echo去掉即可
作者: Batcher    时间: 2019-5-22 09:11

  1. #!/bin/bash
  2. for file in $(ls /tmp/*.dat | awk -F '/' '{print $NF}'); do
  3.     YYYY=${file:0:4}
  4.     MM=${file:4:2}
  5.     DD=${file:6:2}
  6.     HH=${file:8:2}
  7.     MI=${file:10:2}
  8.     SS=${file:12:2}
  9.     echo date -s "$YYYY-$MM-$DD"
  10.     date -s "$YYYY-$MM-$DD"
  11.     echo date -s "$HH:$MI:$SS"
  12.     date -s "$HH:$MI:$SS"
  13. done
复制代码

作者: Batcher    时间: 2019-5-22 09:12

另外,为何不把 date  -s "2019-05-21" 和 date -s "13:13:30" 合并成一个命令呢:
date  -s "2019-05-21 13:13:30"
作者: cfwyy77_bat    时间: 2019-5-22 09:24

一行。
  1. ls /tmp/*.dat |awk 'BEGIN{FS="/|\\."}{da=substr($3,1,8);h=substr($3,9,2);m=substr($3,11,2);s=substr($3,13,2);printf("\"%s %s:%s:%s\"",da,h,m,s)}' | xargs date -s
复制代码

作者: sysclock    时间: 2019-5-22 10:23

版上牛人真多,batcher的支付宝短信给俺一个吧。
谢谢大家。
还有一个任务,请大家帮忙,另外发一个帖子了。
作者: amwfjhh    时间: 2019-5-22 10:38

多文件处理时注意一下执行转换文件的唯一性,另注意下防止其它文件生成的.dat文件的干扰。
作者: sysclock    时间: 2019-5-22 10:51

回复 8# Batcher


    batcher大人这个文件有个小bug,有多少个dat文件,就echo多少次。

root@testGis:/mnt/mmcblk2/scripts# ./caliTime3
date -s 2019-05-22
Wed May 22 00:00:00 UTC 2019
date -s 02:40:57
Wed May 22 02:40:57 UTC 2019
date -s 2019-05-22
Wed May 22 00:00:00 UTC 2019
date -s 02:46:46
Wed May 22 02:46:46 UTC 2019
date -s 2019-05-22
Wed May 22 00:00:00 UTC 2019
date -s 02:48:45
Wed May 22 02:48:45 UTC 2019
date -s 2019-05-22
Wed May 22 00:00:00 UTC 2019
date -s 02:48:46
Wed May 22 02:48:46 UTC 2019
作者: sysclock    时间: 2019-5-22 10:52

回复 9# Batcher


    因为我是新手,炯,
谢谢~
作者: sysclock    时间: 2019-5-22 10:53

回复 7# amwfjhh

这个代码测试是比较完美的。
后来人请参考此。

谢谢~
作者: Batcher    时间: 2019-5-22 10:57

回复 5# sysclock


2、记录可能有最多不超过511个文件,请用时间最新的一个

以后发帖求助的时候,建议把所有需求都更新在顶楼,否则别人帮你写代码的时候很可能无法满足你的真实需求。
作者: Batcher    时间: 2019-5-22 10:59

回复 13# sysclock


把date命令放在for循环外面试试
  1. #!/bin/bash
  2. for file in $(ls /tmp/*.dat | awk -F '/' '{print $NF}'); do
  3.     YYYY=${file:0:4}
  4.     MM=${file:4:2}
  5.     DD=${file:6:2}
  6.     HH=${file:8:2}
  7.     MI=${file:10:2}
  8.     SS=${file:12:2}
  9. done
  10. echo date -s "$YYYY-$MM-$DD"
  11. date -s "$YYYY-$MM-$DD"
  12. echo date -s "$HH:$MI:$SS"
  13. date -s "$HH:$MI:$SS"
复制代码

作者: Batcher    时间: 2019-5-22 11:00

回复 11# sysclock


    http://bbs.bathome.net/thread-10403-1-1.html




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2