我正在编写一个 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
答案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