esa*_*lva 5 unix shell ksh find
我想从格式为YYYYMMDDHH的给定时间戳中查找超过N天的文件
我可以使用以下命令找到超过2天的文件,但是这会查找具有当前时间的文件:
find /path/to/dir -mtime -2 -type f -ls
Run Code Online (Sandbox Code Playgroud)
让我们说我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]);
Run Code Online (Sandbox Code Playgroud)
**注意:我不是 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
Run Code Online (Sandbox Code Playgroud)
我查找所有早于 的文件+$daysFromToday,然后将搜索范围缩小到晚于-$daysOld