搜索最新的文件名

搜索最新的文件名

我正在编写一个 bash 脚本来查找一个文件文件名是最近的,文件名如下:

...
Wed_Dec_30_16:47:41_PHT_2015.zip
Wed_Dec_30_16:00:41_PHT_2015.zip
Wed_Dec_30_16:00:41_PHT_2015.zip
Thu_Dec_31_16:49:14_PHT_2015.zip
...

我正在使用find命令搜索所有 .zip 文件,我想也许我需要一个像这样的数组:

readarray -t lines <<< "$(find . -type f -name '*.zip' -exec basename {} \;|tr -d '[.zip]'|tr '_' ' ')"
len=${#lines[@]}
for ((i=0;i<len;i++)); do
    echo ${lines[$i]}
done

而且,我在终端中得到了像这样的所有文件名(带有日期时间)。它看起来完全:

Wed Dec 30 16:47:41 PHT 2015
Wed Dec 30 16:00:35 PHT 2015
Thu Dec 31 12:14:13 PHT 2015
Thu Dec 31 12:19:34 PHT 2015
Wed Dec 30 16:49:14 PHT 2015
Thu Dec 31 13:01:11 PHT 2015
Mon Dec 28 12:35:44 PHT 2015
...

但是,我不确定如何比较string我使用的那些date

我绝对不确定这是否是一种真正完整的方法来恢复字符串类似Wed Dec 30 16:49:14 PHT 2015的文件Wed_Dec_30_16:49:14_PHT_2015.zip

感谢帮助。

编辑:

我修复了我的脚本,并将“字符串”转换为“日期”,这是秒级的:

declare -a my_array
len=${#lines[@]}
for ((i=0;i<$len;i++));do
    my_array[$i]=`date -d "${lines[$i]}" +%s`
done

并选择最大的一个:

max=${my_array[0]}
for((i=0;i<$len;i++));do
    if [ ${my_array[$i]} -gt $max ];then max=${my_array[$i]};fi
done
echo $max

终端:

1451465261
1451462435
1451535253
1451535574
1451465354
1451538071
1451277344
1451538071 <== max one

那么,我应该将其恢复为:Wed_Dec_30_16:00:41_PHT_2015.zip

有人有简单的方法吗?

答案1

与 gnusort作为input.txt输入(解释):

cat input.txt | sort -t _ -k6n,6.4 -k2M -k3n -k4.1n,4.2 -k4.4n,4.5 -k4.7n,4.8

添加--debug标志以查看用于排序的字段。当您必须调整子字符串时很有用:

Wed_Dec_30_16:00:41_PHT_2015.zip
                        ____
    ___
        __
           __
              __
                 __

答案2

我知道您的数据位于数组中,但我用文件进行了测试。应该没关系——逻辑是一样的。
只需转换为自纪元以来的秒数,测试哪个纪元数最大,并记住该数字 - 这就是您最近的日期。那么显然您需要根据您的文件结构协调该字符串以获得您正在查找的特定文件。

文件:日期.txt

Wed Dec 30 16:47:41 PHT 2015
Wed Dec 30 16:00:35 PHT 2015
Thu Dec 31 12:14:13 PHT 2015
Thu Dec 31 12:19:34 PHT 2015
Wed Dec 30 16:49:14 PHT 2015
Thu Dec 31 13:01:11 PHT 2015
Mon Dec 28 12:35:44 PHT 2015

文件:find_latest.sh

#!/usr/bin/env bash

newest=0

while read line
do
    i=$(awk '{print $1" "$2" "$3" "$4" "$6}' <<<$line)
    epoch=$(date --date="$i" +'%s')
    if [ "$epoch" -gt "$newest" ]
    then
        newest=$(date --date="$i" +"%s")
    fi

done < dates.txt

echo "newest is: "$(date --date="@${newest}")

结果:

newest is: Thu Dec 31 13:01:11 NZDT 2015

相关内容