एक फ़ोल्डर में फ़ाइलें समाप्त करें: एक्स दिनों के बाद फ़ाइलों को हटा दें


12

मैं एक विंडोज़ साझा ड्राइव में "ड्रॉप फ़ोल्डर" बनाना चाहता हूं जो सभी के लिए सुलभ हो। यदि वे फ़ोल्डर में X दिनों से अधिक समय तक बैठते हैं तो मुझे स्वचालित रूप से हटाई जाने वाली फाइलें चाहिए।

हालाँकि, ऐसा लगता है कि सभी विधियाँ ऐसा करने के लिए मिली हैं, अंतिम संशोधित तिथि, अंतिम पहुँच समय, या किसी फ़ाइल के निर्माण की तारीख का उपयोग करें।

मैं इसे एक ऐसा फ़ोल्डर बनाने की कोशिश कर रहा हूं जिसे कोई उपयोगकर्ता किसी के साथ साझा करने के लिए फ़ाइलें छोड़ सकता है। यदि कोई व्यक्ति यहां फ़ाइलों की प्रतिलिपि बनाता है या ले जाता है, तो मैं इस बिंदु पर टिक करना शुरू करना चाहता हूं। हालाँकि, किसी फ़ाइल की अंतिम संशोधित तिथि और निर्माण तिथि तब तक अपडेट नहीं की जाएगी जब तक कि कोई वास्तव में फ़ाइल को संशोधित नहीं करता है। अंतिम एक्सेस समय बहुत बार अपडेट किया जाता है ... ऐसा लगता है कि बस विंडोज़ एक्सप्लोरर में एक निर्देशिका खोलने से अंतिम एक्सेस समय अपडेट हो जाएगा।

किसी को भी इस के समाधान का पता है? मैं सोच रहा हूं कि दैनिक आधार पर फ़ाइलों के हैश को सूचीबद्ध करना और फिर एक निश्चित तिथि से पुरानी हैश के आधार पर फ़ाइलों को समाप्त करना एक समाधान हो सकता है .... लेकिन फाइलों की हैश लेना समय लेने वाली हो सकती है।

किसी भी विचार की बहुत प्रशंसा की जाएगी!

नोट:
मैंने पहले से ही यहाँ पर बहुत सारे उत्तरों को देखा है ... फ़ाइल सर्वर रिसोर्स मॉनिटर, पॉवरशेल स्क्रिप्ट, बैच स्क्रिप्ट इत्यादि में देखा, वे अभी भी अंतिम एक्सेस समय, अंतिम संशोधित समय या निर्माण समय का उपयोग करते हैं ... जो, जैसा कि वर्णित है, उपरोक्त आवश्यकताओं के अनुरूप नहीं है।


@Michael Kjorling द्वारा उल्लिखित एक प्रश्न, क्या टाइमर को गिनना बंद कर दिया जाता है यदि फ़ाइल को बॉक्स में गिराए जाने के बाद संशोधित किया जाता है?
Get-HomeByFiveOClock

आप जो देख रहे हैं वह विंडोज के समान है tmpwatch
अवनी पायने

जवाबों:


5

हमने एक पॉवरशेल स्क्रिप्ट और पॉलिसी के संयोजन का उपयोग किया। नीति निर्दिष्ट करती है कि उपयोगकर्ता को Drop_Zone शेयर के अंदर एक फ़ोल्डर बनाना होगा और फिर उस फ़ोल्डर में जो भी फाइलें चाहिए उन्हें कॉपी करें। जब फ़ोल्डर 7 दिन पुराना हो जाता है (क्रिएशनटाइम का उपयोग करके) तो पॉवरशेल स्क्रिप्ट इसे हटा देगा।

मैंने पॉवरशेल स्क्रिप्ट में कुछ लॉगिंग को भी जोड़ा है ताकि हम इसे सत्यापित कर सकें और पूरी तरह से अयोग्य को बचाने के लिए छाया प्रतियों को चालू कर दिया।

यहां सभी लॉगिंग सामान के बिना स्क्रिप्ट है।

$location = Get-ChildItem \\foo.bar\Drop_Zone
$date = Get-Date
foreach ($item in $location) {
  # Check to see if this is the readme folder
  if($item.PsIsContainer -and $item.Name -ne '_ReadMe') {
    $itemAge = ((Get-Date) - $item.CreationTime).Days
    if($itemAge -gt 7) {
      Remove-Item $item.FullName -recurse -force
    }
  }
  else {
  # must be a file
  # you can check age and delete based on that or just delete regardless
  # because they didn't follow the policy
  }
}

1
यह सबसे सरल लगता है, फ़ाइल डेटाटाइम स्टैम्प, वैकल्पिक डेटा स्ट्रीम, या फ़ाइलों की सूची और उनकी ड्रॉप दिनांक की आवश्यकता नहीं होती है। मैं एक भयानक स्क्रिप्ट बनाने जा रहा था जिसमें हर तरह का जादू था, लेकिन फिर मैंने यह देखा।
बेवुल्फ़नोडे42

और हर समय स्क्रिप्ट को ट्रिगर करने के लिए फ़ाइल सिस्टम वॉच इवेंट की आवश्यकता नहीं होती है, क्योंकि इसे प्रति दिन एक बार चलाया जा सकता है, और इससे कोई फर्क नहीं पड़ता कि यदि कोई दिन किसी कारण से चूक जाता है।
बियोवुल्फ़नोडे42

2
@ BeowulfNode42 की तरह ही बहुत ही सरल विचार। यह सुनिश्चित करने के लिए कि उपयोगकर्ता को एक फ़ोल्डर बनाना चाहिए, "Create Files / Write Data" ACL से "यह फ़ोल्डर केवल" का एक सरल "इनकार" सुनिश्चित करेगा कि उपयोगकर्ताओं को सबफ़ोल्डर भी बनाना होगा।
ब्रेट जी

3

यदि आप मान सकते हैं कि NTFS आप फ़ाइल की वैकल्पिक स्ट्रीम में एक कुंजी (गाइड) लिख सकते हैं। साथ ही तिथि, ताकि आप मूल रूप से डेटाबेस को फ़ाइलों में संग्रहीत कर सकें।

अधिक जानकारी पर पाया जा सकता है

http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx

मूल रूप से आप एक अलग स्ट्रीम में अतिरिक्त सामग्री को स्टोर कर सकते हैं जिसे एक विशेष नाम से कोडित किया गया है।


कोई ऐसा कैसे करेगा?
ब्रेट जी

@BrettG प्रलेखन के लिए लिंक जोड़ा गया। "NTFS अल्टरनेट डेटा स्ट्रीम" ने आपको इसे Google में भी खोज लिया होगा, बस मामले में - आप Google को नहीं जानते हैं।
टॉमटॉम

क्षमा करें, मुझे पता है कि वैकल्पिक डेटा स्ट्रीम क्या हैं, मैं इस संदर्भ में उनके उपयोग को समझने की कोशिश कर रहा था। इसलिए आप एक हैश या कुछ का उपयोग करने के बजाय कह रहे हैं, फ़ाइलों को ट्रैक करने के लिए वैकल्पिक डेटा स्ट्रीम में GUID (और / या दिनांक) का उपयोग करें .. aha।
ब्रेट जी

हाँ। यदि आप किसी फ़ाइल को मज़बूती से मार्क कर सकते हैं - आप इसमें मार्किंग की तारीख भी डाल सकते हैं - तो आपको हैश की गणना करने की आवश्यकता नहीं है।
टॉमटॉम

बस यह देखें कि क्या कोई फ़ाइल स्टोर से कॉपी की गई है, संपादित की गई है, और फिर वापस कॉपी की गई है। आप तब टाइमर को पुनरारंभ करना चाहते हैं, जिसके लिए एक हैश उपयोगी हो सकता है।
एक CVn

2

आप IO.FileSystemWatcher का उपयोग कर सकते हैं, जो आपको बनाई गई नई फ़ाइलों के लिए एक फ़ोल्डर "देखने" की अनुमति देता है। इस काम को करने के लिए आपको ये टुकड़े चाहिए होंगे।

ये चर देखने के लिए पथ को कॉन्फ़िगर करते हैं और फ़िल्टर करने के लिए एक फ़िल्टर करते हैं जो ट्रैक करने के लिए फ़ाइलें हैं:

$watchFolderPath = $env:USERPROFILE
$watchFolderFilter = "*.*"

यह देखने के लिए फ़ोल्डर के लिए पैरामीटर सेट करता है और घटना होने पर प्रदर्शन करने के लिए क्रियाएं करता है। मूल रूप से यह प्रत्येक फ़ाइल पर LastWriteTime को लिखा जाता है जैसा कि यह लिखा है:

$watcher = New-Object IO.FileSystemWatcher $watchFolderPath, $watchFolderFilter -Property @{
    IncludeSubdirectories = $true
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
$onCreated = Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
    $FileName = $Event.SourceEventArgs.FullPath
    $file = Get-Item $FileName
    $file.LastWriteTime = Get-Date
    }

यदि इस का उपयोग करने की आवश्यकता हो तो घटना अपंजीकृत हो सकती है:

Unregister-Event -SourceIdentifier FileCreated

पुरानी फाइलों को साफ करने के लिए अंत में, आप इसे दिन में एक बार चला सकते हैं:

Get-ChildItem $watchFolderPath -Recurse | Where-Object {((Get-Date)-$_.LastWriteTime).TotalDays -gt 6} | Remove-Item

वह सब कुछ होना चाहिए जो आपको चाहिए ...


जब फ़ाइल बनाई जाती है तो LastWriteTime विशेषता सेट करने के लिए इसे संपादित किया जाता है और फिर बाद में फ़ाइलों को हटाने के लिए इसका उपयोग करें।
टिम फेरिल

1

यह एक समय हो गया है, लेकिन मैंने इसे संबोधित करने के लिए एक अपेक्षाकृत सीधे आगे की विधि स्थापित की है।

मैं ड्रॉप निर्देशिका (संसाधन निगरानी उपयोगिता के माध्यम से निगरानी) में जोड़ी गई किसी भी फाइल को स्पर्श करूंगा और अंतिम संशोधित तिथि को फ़ोल्डर में जोड़े गए दिनांक पर सेट कर दूंगा।

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


एकदम सही विचार। मैं अपना स्वयं का शोध करूँगा .. लेकिन कोई भी विचार क्या संसाधन निगरानी उपयोगिता का आपने उपयोग किया है?
ब्रेट जी

@BrettG ईमानदारी से यह लगभग 10 साल पहले था। मुझे याद नहीं आ रहा है। तुम मुझे बूढ़ा बना रहे हो। :) अगर मैं इसे आज करता तो मैं इवेंट व्यूअर में फाइल सिस्टम ऑडिटिंग के आधार पर नौकरी करता। FileSystemWatcher .NET ऑब्जेक्ट PowerShell मेरे विचार से उपलब्ध है। यह एक और विकल्प होगा।
टिम ब्रिघम

हा, मैंने महसूस नहीं किया कि आपका मतलब है कि जब आपने "थोड़ी देर" कहा था। हाँ, काफी मज़ेदार मैं सिर्फ FileSystemWatcher को देख रहा था। हालाँकि, मुझे नहीं लगता कि यह स्थानांतरित / कॉपी की गई फ़ाइलों के साथ काम करेगा। उत्तर के लिए धन्यवाद!
ब्रेट जी

1
@BrettG - फाइलसिस्टम वॉच का उपयोग ट्रैकिंग टेबल के साथ किया जा सकता है, लेकिन इसके अपने मुद्दे हैं। यहाँ देखें: stackoverflow.com/questions/1764809/... stackoverflow.com/questions/6000856/filesystemwatcher-issues
JohnP

1
@BrettG - इसके अलावा, यह FSW के लिए एक अच्छा विस्तार है: codeproject.com/Articles/58740/…
जॉनपी

1

जब फ़ाइल की प्रतिलिपि बनाई गई थी या फ़ोल्डर में ले जाया गया था, तो तारीखों पर भरोसा करने का कोई तरीका नहीं है। विंडोज इसे फाइलसिस्टम, ड्राइव, नेटवर्क शेयर्स आदि में संरक्षित करने का प्रबंधन करता है। आप एक लिनक्स फाइल सर्वर के साथ कुछ काम कर सकते हैं, या एफ़टीपी या एक वेब आधारित अपलोड सिस्टम का उपयोग करके लोगों को सीधे फाइल कॉपी करने से रोक सकते हैं।

यदि आप लोगों को अपलोड करने के बाद फ़ाइलों को संशोधित करने में सक्षम नहीं हैं, तो आपके पास अलग-अलग अपलोड और एक्सेस फ़ोल्डर्स हो सकते हैं, और एक स्क्रिप्ट जो उनके बीच फ़ाइलों को स्थानांतरित करती है और उन्हें फिर से तारीख करती है। लेकिन ऐसा लगता है कि आप चाहते हैं कि लोग सीधे फाइलों को संशोधित करने में सक्षम हों।

तो एक सरल, अगर कुछ हद तक हैक किया जाता है, तो समाधान तारीखों के साथ गड़बड़ करना होगा। मैं दो स्क्रिप्ट लिखूंगा:

प्रति घंटा दिनांक परिवर्तक स्क्रिप्ट

एक स्क्रिप्ट को एक घंटे या एक बार, अपनी पसंदीदा भाषा में चलाएं:

  • पिछले 20 वर्षों के भीतर संशोधित तिथि के साथ किसी भी फ़ाइल के लिए दिखता है।
  • जब यह इस तरह की फ़ाइल पाता है, तो इसे आज के 20 वर्षों के लिए संशोधित तिथि बदल दें।

शक्तियों में, यह कुछ इस तरह दिखेगा:

$path = "D:\test"

$today = Get-Date
$before = $today.AddDays(-7300) #356*20 days

Get-ChildItem -Recurse -Path $path | foreach {
    if ($_.LastWriteTime -gt $before) {
        Write-Host $_.Name
        $_.LastWriteTime = $before
    }
}

आज (27 मई) को इस स्क्रिप्ट को चलाते हुए, सभी फाइलों की संशोधित तिथि 1 जून, 1994 - ठीक 356 * 20 दिन पहले सेट की गई। क्योंकि यह केवल मूल्य से पहले $ से नई फ़ाइलों को बदल रहा है, यह उन फ़ाइलों को स्पर्श नहीं करेगा जो पहले से ही अतीत में सेट है।

सफाई स्क्रिप्ट

सफाई स्क्रिप्ट हर रात चलेगी, और:

  • "20 साल और X दिन पहले" संशोधित तिथि के साथ फाइल खोजें
  • उन्हें हटाओ

मैं इस भाग के लिए स्क्रिप्ट नहीं लिखूंगा - बहुत सारी उपयोगिताओं हैं जो उन फ़ाइलों को हटाने का काम कर सकती हैं जो एक निर्दिष्ट तिथि से अधिक पुरानी हैं, जो भी आपको पसंद है। महत्वपूर्ण हिस्सा उन फाइलों की तलाश करना है जो 7300 + X दिन पुरानी हैं, जहां एक्स उन दिनों की संख्या है जो आप उन्हें रखना चाहते हैं क्योंकि वे अंतिम बार संशोधित किए गए थे।

लाभ

यहाँ अन्य उत्तरों पर इसके कुछ फायदे हैं:

  • यदि कोई फ़ाइल संशोधित करता है, तो टाइमर रीसेट हो जाएगा।
  • फ़ाइलों को चिह्नित करने के लिए NTFS वैकल्पिक धाराओं की कोई आवश्यकता नहीं है (जो फ़ाइल को स्थानांतरित करते समय संरक्षित हैं, इसलिए संशोधित फ़ाइल को समय से पहले हटाने का कारण बन सकता है)
  • यदि कोई प्रदर्शन प्रभाव कम से कम होना चाहिए। डेटाबेस और फ़ाइल नाम और / या हैश की सूची रखने की आवश्यकता नहीं है।
  • यदि स्क्रिप्ट चलाने में विफल हो जाती है तो कुछ भी नहीं टूटता है। तारीख को अद्यतन करने के लिए आवश्यक कोई सेवा या लगातार चलने वाला कार्यक्रम नहीं है। बस एक जोड़े को निर्धारित कार्य। समाधान जो नई फ़ाइलों को देखने पर निर्भर करते हैं और अभी अपने अंतिम संशोधित समय को अपडेट करते हैं, यदि सेवा विफल हो जाती है या दौड़ की स्थिति में चलती है, तो नई फ़ाइलों को हटाने का अंत हो सकता है।

एकमात्र समस्या जो मैं देख सकता हूं, वह यह है कि लोग उस फ़ाइल की प्रतिलिपि बनाते हैं जिसे अंतिम बार 20 साल पहले ड्रॉप फ़ोल्डर में संशोधित किया गया था। मुझे लगता है कि ज्यादातर परिदृश्यों में, यह एक मुद्दे के ज्यादा होने की संभावना नहीं है, लेकिन यह सामने आ सकता है।


0

आप एक वेब पेज के माध्यम से ड्रॉप बॉक्स में फ़ाइलों को जोड़ने को औपचारिक बना सकते हैं, जिसमें "अपलोड" IFRAME है। उपयोगकर्ता तब फ़ाइल को "पोस्ट" कर सकता है, जो सर्वर पर एक PHP / ASP जॉब को आमंत्रित करता है, जो फ़ाइल को लेता है और इसे प्यूकर स्थान पर रखता है। PHP / ASP किसी भी संख्या में अनुक्रमणिका / विश्लेषण कार्य कर सकता है।


0

यदि कोई व्यक्ति यहां फ़ाइलों की प्रतिलिपि बनाता है या ले जाता है, तो मैं इस बिंदु पर टिक करना शुरू करना चाहता हूं। हालाँकि, किसी फ़ाइल की अंतिम संशोधित तिथि और निर्माण तिथि तब तक अपडेट नहीं की जाएगी जब तक कि कोई वास्तव में फ़ाइल को संशोधित नहीं करता है।

मैं एक स्क्रिप्ट बनाता हूं जो हर पांच मिनट में निर्धारित कार्यों के रूप में चलती है और दो काम करती है।

  1. पहली क्रिया फ़ोल्डर में कॉपी की गई किसी भी फ़ाइल की प्रतिलिपि बनाती है, फ़ाइल पर एक उपसर्ग लगाती है और मूल को हटा देती है। यह सुनिश्चित करेगा कि आवेदन के लिए फ़ाइल की निर्माण तिथि एक समान थी।
  2. दूसरी कार्रवाई पूर्वनिर्धारित उपसर्ग (कार्रवाई 1 के साथ सेट) के साथ सभी फाइलों को देखेगा और उन लोगों में से किसी को हटा देगा, जो X दिनों से अधिक पुरानी है। यह संशोधन / अभिगमन तिथि समस्या का समाधान करेगा।

0

फ़ाइलों को चिह्नित करने के लिए एक मौजूदा तंत्र है, संग्रह बिट। यह डॉस के शुरुआती दिनों से है, और FAT और NTFS दोनों पर मौजूद है।

मूल रूप से, प्रत्येक फ़ाइल में डिफ़ॉल्ट रूप से संग्रहित बिट सेट होगा। यदि आप अपने ड्रॉप फ़ोल्डर में संग्रह बिट के साथ एक फ़ाइल देखते हैं , (1) उस बिट को साफ़ करें और (2) इसकी तिथि आज तक निर्धारित करें। यदि आप उस बिट के बिना एक फ़ाइल देखते हैं और अतीत में एक तारीख <= 7 दिनों के साथ, इसे हटा दें।

यदि कोई उपयोगकर्ता ड्रॉप फ़ोल्डर में रहते हुए फ़ाइल को लिखता है, तो उसका संग्रह बिट फिर से सेट हो जाता है, इसलिए उसका जीवनकाल भी 7 दिनों के लिए रीसेट हो जाता है। यह एक नई फ़ाइल के प्रभाव में है, सब के बाद।

अब आप सुरक्षित रूप से FileSystemWatcher का उपयोग कर सकते हैं। इसकी कोई भी समस्या (जैसे डुप्लिकेट ईवेंट, बफर ओवरफ़्लो विस्तृत जानकारी खोना) अब कोई फर्क नहीं पड़ता क्योंकि संबंधित जानकारी सभी फ़ाइल मेटाडेटा में है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.