2012-06-28 25 views
5

我想找到格式YYYYMMDDHH從給定的時間戳超過N天的舊文件如何找到N多天的文件從一個給定的時間戳

我可以找到下面的命令文件超過2天以上,但是這查找文件利用當前時間:

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

可以說,我給輸入timestamp=2011093009我想找到的文件超過2天以上的,從2011093009.

一直在做我的研究,但似乎無法推測出來。

+0

遞歸?當前目錄? – ormaaj

+0

是的,遞歸地...'/ path/to/dir下的所有文件' – esausilva

+0

找到2天以前的命令是find/path/to/dir -mtime +2 -type f -ls?我嘗試了這一點,並在我的系統(xubuntu,bash)'-2'選項到'-mtime'會發現比2天更新的文件。 – jhonkola

回答

0

這基本上是通過在一定範圍的日期查找文件來實現的。 ..

由於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

0

把答案之一from here和使用$()的建議here

(由sputnick更新根據註釋)

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

'expr'是舊時尚;''日期= 2011060109; find/home/kenjal/-mtime $(($(日期+%Y%m%d%H) - $(日期-d $ date +%Y%m%d%H)))' –

+0

這需要GNU當然日期(-d選項不可移植)。另外,我不認爲這會喚起原來的問題。他希望自某日期起的文件比N天晚。不知道如何自己做這個... – BellevueBob

+0

鮑勃·杜爾:你是一個正確的,我想從某個日期起N天以上的文件。是的,我沒有GNU日期,所以'-d'選項對我不起作用 – esausilva

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 "[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的系統。在這種情況下,您可以對上述腳本進行一些修改。

+0

感謝您的回覆...不幸的是,我的系統沒有GNU日期,所以'-d'不是一個選項......但是,通過一點研究,我已經想出了我的問題的答案。你可以看看我接受的答案 – esausilva

+0

沒關係,當我完成這個任務時,我注意到了你的其他評論。無論如何,我希望有人發現它很有用。 – ormaaj

相關問題