2012-06-28 7 views
5

मैं प्रारूप व.व.व.व.म.म.दि.दि.घं.घं. में दिए गए टाइमस्टैम्प से एन दिनों से पुराने फाइल को खोजना चाहते हैंकिसी दिए गए टाइमस्टैम्प से एन दिनों से पुराने फाइलों

मैं नीचे कमांड के साथ 2 दिनों से पुराने फ़ाइल पा सकते हैं खोजने के लिए कैसे, लेकिन इस वर्तमान समय के साथ फ़ाइलों को पाता है:

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

चलें कहते हैं कि मैं इनपुट दे timestamp=2011093009 मैं फ़ाइलों 2011093009.

से 2 दिनों से पुराने खोजने के लिए मेरे शोध कर दिया गया है, लेकिन यह पता लगा नहीं कर पा रहे ।

+0

पुनरावर्ती? वर्तमान निर्देशिका? – ormaaj

+0

हां, रिकर्सिवली .. सभी फाइलें '/ path/to/dir ' – esausilva

+0

के तहत फाइलें 2 दिनों से अधिक पुरानी खोजने के लिए कमांड को' ढूंढें/पथ/से/dir -mtime +2 -type f -ls' होना चाहिए?मैंने यह कोशिश की और मेरी प्रणाली (xubuntu, bash) '-2'' विकल्प को '-mtime' के लिए 2 दिनों से अधिक नई फाइलें मिलेंगी। – jhonkola

उत्तर

0

मूल रूप से इस तिथियों की सीमा में फ़ाइलें खोजने द्वारा पूरा किया है के रूप में जवाब में से एक from here और $ का उपयोग कर() डाल दिया। ..

मैंने आज से दिए गए टाइमस्टैंप के दिनों की गणना करने के लिए पेर्ल का उपयोग किया क्योंकि जीएनयू तिथि मेरे सिस्टम में उपलब्ध नहीं है, इसलिए -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]); 

** नोट: मैं पर्ल में कोई विशेषज्ञ नहीं हूं और यह कोड का पहला भाग है जिसे मैं संशोधित/लिखता हूं। ऐसा कहकर, मुझे यकीन है कि उपरोक्त को पर्ल

में नीचे पूरा करने के बेहतर तरीके हैं, तो नीचे की कॉर्न स्क्रिप्ट को मेरी ज़रूरतों को पूरा करने के लिए।

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

सुझाव here

(sputnick द्वारा टिप्पणी के अनुसार अद्यतन)

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

'expr' पुराना फैशन है;)' दिनांक = 201106010 9; ढूंढें/घर/केंजल/-माटा $ (($ (दिनांक +% वाई% एम% डी% एच) - $ (दिनांक-डी $ दिनांक +% वाई% एम% डी% एच)) ' –

+0

इसके लिए जीएनयू की आवश्यकता है पाठ्यक्रम की तारीख (-d विकल्प पोर्टेबल नहीं है)। साथ ही, मुझे नहीं लगता कि यह मूल प्रश्नकर्ता है; वह कुछ तारीख से एन दिनों की तुलना में OLDER फ़ाइलों को चाहता है। यह सुनिश्चित नहीं है कि यह कैसे करें ... – BellevueBob

+0

बॉब डुएल: आप सही हैं, मैं कुछ तारीख से एन दिनों की तुलना में OLDER फ़ाइलों को चाहता हूं। और हाँ, मेरे पास जीएनयू तिथि नहीं है, इसलिए '-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: 

से नए दिनों के लिए खोज को सीमित यह बैश स्क्रिप्ट दो तिथियों और find के लिए एक पथ नाम लेता है। getFiles एक सरणी नाम लेता है और दो तिथियों के बीच mtimes वाली फ़ाइलों को उस सरणी को असाइन किया जाता है। यह उदाहरण स्क्रिप्ट बस सरणी प्रिंट करता है।

हाल ही में बैश और जीएनयू तिथि की आवश्यकता है। यदि यह वास्तव में "एन दिन" होना है, या आपके पास जीएनयू तिथि नहीं है, तो कोई संभावित समाधान नहीं है। आपको एक अलग भाषा का उपयोग करने की आवश्यकता होगी। मानक उपयोगिताओं का उपयोग कर कोई खोल नहीं कर सकता है।

तकनीकी रूप से, आप printf '%(%s)T' ... और कुछ अंकगणित का उपयोग करके दिनों में ऑफ़सेट की गणना कर सकते हैं, लेकिन जीएनयू तिथि के बिना टाइमस्टैम्प से बेस डेट प्राप्त करने का कोई संभावित तरीका नहीं है, इसलिए मुझे डर है कि आप भाग्य से बाहर हैं।

संपादित

मैं देख रहा हूँ इस सवाल का एक ksh टैग, जिस स्थिति में मैं झूठ बोला है, जाहिरा तौर पर ksh93 के printf एक जीएनयू दिनांक स्ट्रिंग की तरह -d स्वीकार करता है। मुझे नहीं पता कि यह पोर्टेबल है, और निश्चित रूप से ksh93 स्थापित के साथ एक सिस्टम की आवश्यकता है। आप उपरोक्त स्क्रिप्ट में कुछ संशोधन के साथ उस मामले में ऐसा कर सकते हैं।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद ... दुर्भाग्य से, मेरे सिस्टम में जीएनयू तिथि नहीं है, इसलिए '-d' एक विकल्प नहीं है ... लेकिन, थोड़ा और शोध के साथ, मैंने अपने प्रश्न का उत्तर निकाला है। आप मेरे स्वीकृत उत्तर – esausilva

+0

पर एक नज़र डाल सकते हैं हाँ, ठीक है, मैंने आपकी अन्य टिप्पणियों में देखा जैसे मैंने इसे समाप्त किया। मुझे आशा है कि किसी को भी इसे उपयोगी लगेगा। – ormaaj

संबंधित मुद्दे