我想从 YYYYMMDDHH 格式的给定时间戳中查找超过 N 天的文件
我可以使用以下命令找到超过 2 天的文件,但这会找到当前时间的文件:
find /path/to/dir -mtime -2 -type f -ls
假设我给出了timestamp=2011093009
我想查找从 2011093009 开始超过 2 天的文件的输入。
一直在研究,但似乎无法弄清楚。
基本上,这是通过在一系列日期中查找文件来完成的......
我使用 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
#!/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 的系统。在这种情况下,您可以通过对上述脚本进行一些修改来做到这一点。