如何按文件名中的时间查找文件?

如何按文件名中的时间查找文件?

我们有一个目录包含文件名中包含时间的文件

./test.2013-06-11_06-01.gz
./test.2013-06-12_01-01.gz
./test.2013-06-13_03-01.gz
./test.2013-06-14_03-01.gz
./test.2013-06-15_04-01.gz

如果文件名超过,如何列出文件N天前?

答案1

像这样的事情怎么样?

maxdate=$(date -d "5 days ago" "+%Y-%m-%d");
for fn in *.gz; do
    [ "$fn" ">" "test.${maxdate}_99-99.gz" ] || echo $fn
done

我忽略了日期之后的文件名部分(大概是时间?),但是如果需要的话,修改它以考虑文件名的该部分将是相当容易的。

这个答案基于 Stack Overflow 上的一个类似问题:https://stackoverflow.com/questions/2443078/filtering-filenames-with-bash

答案2

您可以使用date命令查找 N 天前的日期,然后使用grep在文本文件中搜索。

grep `date +%Y-%m-%d -d "5 days ago"` test.txt

测试.txt:

./test.2013-06-11_06-01.gz
./test.2013-06-12_01-01.gz
./test.2013-06-13_03-01.gz
./test.2013-06-14_03-01.gz
./test.2013-06-15_04-01.gz

输出:

./test.2013-06-15_04-01.gz

今天是 20/06/2013,5 天前是 15/06/2013。

更新

最终的解决方案,我使用一个小脚本:

#!/bin/bash

FILE=$1
tmp="/tmp/tmp_$$.txt"
tmp1="/tmp/tmp1_$$.txt"
maxday=$2

cp $FILE $tmp

for i in `seq 1 $maxday`
do
    date_point=`date +%Y-%m-%d -d "$i days ago"`
    grep -v "$date_point" $tmp > $tmp1
    cp $tmp1 $tmp
done

echo "Files match:"
cat $tmp
rm -rf $tmp
rm -rf $tmp1

该脚本将从输出中删除 N 天前至今的所有文件,因此如果您想查找所有早于 N 天的文件,则必须定义maxday = N - 1,即如果您想归档早于 8 天的文件:

./test.sh test.txt 7

输出:

Files match:
./test.2013-06-11_06-01.gz
./test.2013-06-12_01-01.gz

相关内容