在 bash 中查找文件日期之前的星期六

在 bash 中查找文件日期之前的星期六

我有一个包含大量需要迭代的文件的目录,并且想要一种有效的方法来找到文件最后修改时间之前的星期六。

以下是两个示例。第一个只是一个简单的文件,它是在

$ date -r file_1
Wed Jun 21 08:26:35 CDT 2017
$ date -d "$(date -r file_1 '+%F') - $(date -r file_1 '+%u') days - 1 days"
Sat Jun 17 00:00:00 CDT 2017

如果是在星期六修改的,我想要前一个星期六的修改。

$ date -r file_2
Sat Jun 17 00:00:00 CDT 2017
$ date -d "$(date -r file_2 '+%F') - $(date -r file_2 '+%u') days - 1 days"
Sat Jun 10 00:00:00 CDT 2017

如您所见,我有一个方法可以做到这一点,但这个过程在计算上非常长。它强制日期进行自然英语解析,当您执行数百或数千次时,它会非常慢。

答案1

  1. 关于100倍快的方法,使用stat获取日期,然后date -f -两次进行数学运算和格式化,使用/usr/bin/*4852文件)为例:

    stat -c %y /usr/bin/* | date -f - "+%F - %u days - 1 days" | date -f -
    

    输出为4852各个日期的线路,均为前一个星期六。

  2. 速度较慢:合并两个date子壳大约需要33%更短的时间:

    date -r /bin/bash "+%F"  # print this only for reference
    date -d "$(date -r /bin/bash "+%F - %u days - 1 days")"
    

    输出:

    2017-05-16
    Sat May 13 00:00:00 EDT 2017
    

对两者进行基准测试(循环中的第二种方法for):

$ time -p stat -c %y /usr/bin/* | date -f - "+%F - %u days - 1 days" | \
       date -f - > /dev/null
real 0.19
user 0.14
sys 0.19
$ time -p for f in /usr/bin/* ; do \
       date -d "$(date -r "$f" "+%F - %u days - 1 days")" ; done > /dev/null
real 27.31
user 8.11
sys 14.93

相关内容