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

时间:2012-06-28 15:29:57

标签: shell unix find ksh

我想从YYYYMMDDHH格式的给定时间戳中查找超过N天的文件

我可以使用以下命令找到超过2天的文件,但这会查找具有当前时间的文件:

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

假设我提供输入timestamp=2011093009我想查找2011093009之后超过2天的文件。

一直在做我的研究,但似乎无法弄明白。

3 个答案:

答案 0 :(得分:0)

根据建议from here

输入其中一个答案here并使用$()

(根据sputnick的评论更新)

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

答案 1 :(得分: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更新的日期

答案 2 :(得分: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日期-d字符串。我不知道它是否可移植,当然还需要一个安装了ksh93的系统。在这种情况下,您可以对上述脚本进行一些修改。