我想找到格式YYYYMMDDHH從給定的時間戳超過N天的舊文件如何找到N多天的文件從一個給定的時間戳
我可以找到下面的命令文件超過2天以上,但是這查找文件利用當前時間:
find /path/to/dir -mtime -2 -type f -ls
可以說,我給輸入timestamp=2011093009
我想找到的文件超過2天以上的,從2011093009.
一直在做我的研究,但似乎無法推測出來。
我想找到格式YYYYMMDDHH從給定的時間戳超過N天的舊文件如何找到N多天的文件從一個給定的時間戳
我可以找到下面的命令文件超過2天以上,但是這查找文件利用當前時間:
find /path/to/dir -mtime -2 -type f -ls
可以說,我給輸入timestamp=2011093009
我想找到的文件超過2天以上的,從2011093009.
一直在做我的研究,但似乎無法推測出來。
這基本上是通過在一定範圍的日期查找文件來實現的。 ..
由於GNU日期在我的系統中不可用,因此我使用了perl來計算從今天到給定時間戳的日期,因此-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
(由sputnick更新根據註釋)
date=2011060109; find /home/kenjal/ -mtime $(($(date +%Y%m%d%H) - $(date -d $date +%Y%m%d%H)))
'expr'是舊時尚;''日期= 2011060109; find/home/kenjal/-mtime $(($(日期+%Y%m%d%H) - $(日期-d $ date +%Y%m%d%H)))' –
這需要GNU當然日期(-d選項不可移植)。另外,我不認爲這會喚起原來的問題。他希望自某日期起的文件比N天晚。不知道如何自己做這個... – BellevueBob
鮑勃·杜爾:你是一個正確的,我想從某個日期起N天以上的文件。是的,我沒有GNU日期,所以'-d'選項對我不起作用 – esausilva
#!/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 "[email protected]"
# 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的系統。在這種情況下,您可以對上述腳本進行一些修改。
遞歸?當前目錄? – ormaaj
是的,遞歸地...'/ path/to/dir下的所有文件' – esausilva
找到2天以前的命令是find/path/to/dir -mtime +2 -type f -ls?我嘗試了這一點,並在我的系統(xubuntu,bash)'-2'選項到'-mtime'會發現比2天更新的文件。 – jhonkola