2012-06-28 12 views
5

vorrei trovare file più vecchi di N giorni da una determinata data e ora in formato YYYYMMDDHHCome trovare file più vecchi di N giorni da una data timestamp

riesco a trovare il file più vecchi di 2 giorni con il seguente comando, ma questo trova i file con il tempo presente:

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

Diciamo che io do l'ingresso timestamp=2011093009 voglio trovare i file più vecchi di 2 giorni dalla 2011093009.

fatto la mia ricerca, ma non riesco a capirlo .

+0

in modo ricorsivo? directory corrente? – ormaaj

+0

sì, in modo ricorsivo..tutti i file in '/ percorso/in/dir' – esausilva

+0

Il comando per trovare più vecchio di 2 giorni dovrebbe essere 'find/percorso/a/dir -mtime +2 -type f -ls'?Ho provato questo e sul mio sistema (xubuntu, bash) l'opzione '-2' per' -mtime' trovava i file più nuovi di 2 giorni. – jhonkola

risposta

0

Fondamentalmente questo è compiuta la ricerca di file in un intervallo di date. ..

Ho usato perl per calcolare i giorni da oggi al dato data poiché la data GNU non è disponibile nel mio sistema, quindi -d non è un'opzione. Codice sottostante accetta data in formato AAAAAAMM. Vedi sotto:

#!/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]); 

** Nota: Non sono un esperto in Perl e questo è il primo pezzo di codice modifico/scrittura. Detto questo, sono sicuro che ci sono modi migliori per realizzare quanto sopra in Perl

Quindi lo script di sotto di Korn per eseguire ciò che mi serviva.

#!/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 

sto trovando tutti i file più vecchi di +$daysFromToday, quindi restringendo la ricerca a giorni più recenti di -$daysOld

0

mettere una delle risposte from here e utilizzando $() come suggerito here

(aggiornato come da commento di Sputnick)

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

'expr' è la vecchia maniera;)' date = 2011060109; trovare/home/kenjal/-mtime $ (($ (data +% Y% m% d% H) - $ (data -d $ data +% Y% m% d% H))) ' –

+0

Ciò richiede GNU data del corso (l'opzione -d non è portabile). Inoltre, non penso che questa sia la domanda originale; vuole file più vecchi di N giorni da qualche data. Non sono sicuro di come farlo da solo ... – BellevueBob

+0

Bob Duell: hai ragione, voglio file più vecchi di N giorni da qualche data. E sì, non ho la data di GNU, quindi l'opzione '-d' non funziona per me – 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: 

Questo script Bash prende due date e un percorso per find. getFiles prende un nome di matrice e i file con mtimes tra le due date sono assegnati a quell'array. Questo script di esempio stampa semplicemente la matrice.

Richiede un Bash recente e una data di GNU. Se davvero deve essere "N giorni", o non hai data GNU, allora non c'è soluzione possibile. Avrai bisogno di usare una lingua diversa. Nessuna shell può farlo utilizzando le utilità standard.

Tecnicamente, è possibile calcolare un offset in giorni utilizzando printf '%(%s)T' ... e alcuni calcoli aritmetici, ma non c'è modo di ottenere la data di base da un timestamp senza la data di GNU, quindi temo che non abbiate fortuna.

Modifica

Vedo questa domanda ha un tag ksh, nel qual caso Ho mentito, a quanto pare printf di ksh93 accetta una data GNU -d come stringa. Non ho idea se sia portatile e, naturalmente, richiede un sistema con ksh93 installato. Potresti farlo in quel caso con alcune modifiche allo script sopra.

+0

grazie per la tua risposta ... sfortunatamente, il mio sistema non ha la data di GNU, quindi '-d' non è un'opzione ... ma, con un po' di ricerca in più, Ho trovato una risposta alla mia domanda. puoi dare un'occhiata alla mia risposta accettata – esausilva

+0

Sì, va bene, ho notato nei tuoi altri commenti proprio mentre terminavo con questo. Spero che qualcuno lo trovi comunque utile. – ormaaj

Problemi correlati