我们有一个目录包含文件名中包含时间的文件
./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