如何从给定的时间戳中查找早于N天的文件

5

我希望能够根据格式为YYYYMMDDHH的给定时间戳,找到比该时间戳早N天的文件。

我可以使用以下命令查找早于2天的文件,但是这将查找现在的文件:

find /path/to/dir -mtime -2 -type f -ls

假设我输入timestamp=2011093009,我想找到早于2011093009两天的文件。
一直在做研究,但似乎无法解决。

递归?当前目录? - ormaaj
是的,递归地返回/path/to/dir目录下的所有文件。 - esausilva
寻找两天前的命令应该是 find /path/to/dir -mtime +2 -type f -ls 吗?我尝试了一下,在我的系统(xubuntu,bash)中,-mtime-2 选项会找到比两天新的文件。 - jhonkola
我不喜欢-mtime,因为我觉得它太“相对”了。为了更“绝对”的解决方案,请尝试使用“touch -t”创建具有相关时间戳的文件,然后使用find的“-newer”和“!”运算符。 - user354134
3个回答

0

基本上,这是通过在一定日期范围内查找文件来完成的...

我使用perl计算从今天到给定时间戳的天数,因为我的系统中没有GNU日期,所以-d不是一个选项。下面的代码接受格式为YYYYDDMM的日期。请参见以下内容:

#!/usr/bin/perl 
use Time::Local;

my($day, $month, $year) = (localtime)[3,4,5];
$month = sprintf '%02d', $month+1;
$day   = sprintf '%02d', $day;
my($currentYear, $currentDM) = ($year+1900, "$day$month");
my $todaysDate = "$currentYear$currentDM";
#print $todaysDate;

sub to_epoch {
    my ($t) = @_;  
    my ($y, $d, $m) = ($t =~ /(\d{4})(\d{2})(\d{2})/); 
    return timelocal(0, 0, 0, $d+0, $m-1, $y-1900);
}
sub diff_days {
    my ($t1, $t2) = @_;  
    return (abs(to_epoch($t2) - to_epoch($t1))) / 86400; 
}
print diff_days($todaysDate, $ARGV[0]);

注意:我不是Perl专家,这是我修改/编写的第一段代码。话虽如此,我相信在Perl中有更好的方法来完成上述任务。

然后使用下面的korn脚本来执行我所需的操作。

#!/bin/ksh
daysFromToday=$(dateCalc.pl 20110111)
let daysOld=$daysFromToday+31
echo $daysFromToday "\t" $daysOld

find /path/to/dir/ -mtime +$daysFromToday -mtime -$daysOld -type f -ls

我正在查找所有早于+$daysFromToday的文件,然后将搜索范围缩小到比-$daysOld新的天数


0
#!/usr/bin/env bash

# getFiles arrayName olderDate newerDate [ pathName ]
getFiles() {
    local i
    while IFS= read -rd '' "$1"'[(_=$(read -rd "" x; echo "${x:-0}")) < $2 && _ > $3 ? ++i : 0]'; do 
        :
    done < <(find "${4:-.}" -type f -printf '%p\0%Ts\0')
}

# main date1 date2 [ pathName ]
main() {
    local -a dates files
    local x
    for x in "${@:1:2}"; do
        dates+=( "$(date -d "$x" +%s)" ) || return 1
    done

    _=$dates let 'dates[1] > dates && (dates=dates[1], dates[1]=_)'
    getFiles files "${dates[@]}" "$3"
    declare -p files
}

main "$@"

# vim: set fenc=utf-8 ff=unix ts=4 sts=4 sw=4 ft=sh nowrap et:

这个Bash脚本接受两个日期和一个find的路径名。 getFiles以数组名称为参数,并将两个日期之间的mtimes的文件分配给该数组。此示例脚本仅打印该数组。
需要最近的Bash和GNU日期。如果确实必须是“N天”,或者您没有GNU日期,那么就没有可能的解决方案。您需要使用不同的语言。没有shell可以使用标准工具完成此操作。
从技术上讲,您可以使用printf'%(%s)T'...进行一些算术计算来计算偏移量的天数,但是无法在没有GNU日期的情况下从时间戳获取基础日期,所以恐怕你没有办法。
编辑
我看到这个问题有一个ksh标签,在这种情况下,我撒谎了,显然ksh93的printf接受类似于GNU date -d的字符串。我不知道它是否可移植,并且当然需要安装ksh93的系统。在这种情况下,您可以通过对上述脚本进行一些修改来完成它。

谢谢您的回复...不幸的是,我的系统没有GNU日期,所以-d不是一个选项...但是,经过更多的研究,我已经找到了我的问题的答案。您可以查看我的被接受的答案。 - esausilva
没问题,我刚完成这个时就注意到你的其他评论了。无论如何,我希望有人会发现它有用。 - ormaaj

0

将其中一个答案从这里放置,并按照建议在此处使用$()链接

(根据sputnick的评论进行更新)

date=2011060109; find /home/kenjal/ -mtime $(( $(date +%Y%m%d%H) - $(date -d $date +%Y%m%d%H) ))

2
expr 已经过时了 ;) date=2011060109; find /home/kenjal/ -mtime $(( $(date +%Y%m%d%H) - $(date -d $date +%Y%m%d%H) )) - Gilles Quénot
这当然需要GNU日期(-d选项不可移植)。另外,我认为这并没有回答原始问题;他想要从某个日期开始N天前的文件。我自己也不确定如何做到这一点... - BellevueBob
Bob Duell:你说得对,我想要从某个日期开始的N天前的文件。是的,我没有GNU日期,所以“-d”选项对我无效。 - esausilva
kinjal:谢谢你的回答,你提供的链接指导我得到了正确的答案,花了我一些时间,但最终我搞定了 :)。我马上会发布它... - esausilva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接