Windows पुनरावर्ती स्पर्श आदेश


17

विंडोज 7 में, मैं डेट / टाइम स्टैम्प को अपडेट करने के लिए सभी फाइलों को एक डायरेक्टरी में (सबडायरेक्टरीज सहित) कैसे छू सकता हूं?

क्या विंडोज 7 में इसे पूरा करने के लिए एक तंत्र है?



उस लिंक में "स्वीकृत" उत्तर .NET प्रोग्रामिंग लाइब्रेरी का उपयोग करने के बारे में है जो एक फ़ाइल के लिए पूरा करता है। अन्य एकल फ़ाइलों को अद्यतन करने के लिए एक संदर्भ मेनू जोड़ने के बारे में थे। मैं एक निर्मित कमांड के लिए देख रहा था यह एन फ़ाइलों को पुनरावर्ती रूप से करने के लिए। नीचे दिए गए जवाब ने इसे सभी फाइलों के लिए करने का काम किया। यह बिल्ट-इन नहीं है, लेकिन यह काम करता है। धन्यवाद।
jmq

यह यूनिक्स स्पर्श कमांड के विंडोज संस्करण का डुप्लिकेट नहीं है , क्योंकि यह प्रश्न विशेष रूप से पुनरावृत्ति के लिए पूछ रहा है। हालाँकि, ध्यान दें कि उस प्रश्न के कुछ उत्तरों में पुनरावर्ती रूप हैं।
JdeBP

जवाबों:


19

कई संभावनाएं हैं:

  • एक यूनिक्स touchकमांड के एक पोर्ट का उपयोग करें और बस यूनिक्स तरीके से गठबंधन findऔर touchकई विकल्प हैं। अक्सर उल्लेखित GNUWin32 , cygwin और unxutils हैं । कम प्रसिद्ध, लेकिन कुछ मायनों में बेहतर, SFUA उपयोगिता टूलकिट में उपकरण हैं , जो UNIX- आधारित अनुप्रयोगों के लिए सबसिस्टम में चलते हैं, जो विंडोज 7 अल्टीमेट संस्करण और विंडोज सर्वर 2008 R2 के साथ बॉक्स में वहीं आता है। (Windows XP के लिए, एक कर सकते हैं डाउनलोड और स्थापित यूनिक्स संस्करण 3.5 के लिए सेवा से।) यह टूलकिट कमांड लाइन TUI उपकरणों की एक बड़ी संख्या है, mvऔर duकॉर्न और सी के गोले के माध्यम से, करने के लिएperlऔर awk। यह x86-64 और IA64 दोनों फ्लेवर्स के साथ-साथ x86-32 दोनों में आता है। cygwin1.dllWin32 पर चीजें लेयरिंग के साथ-साथ एमुलेटर डीएलएल (जैसे ) के बजाय विंडोज के देशी उचित पॉसिक्स वातावरण में प्रोग्राम चलते हैं । और हां, टूलकिट में touchऔर findसाथ ही कुछ 300 अन्य हैं।
    इन सभी टूलकिट्स को निश्चित रूप से हर फ़ाइल को छुआ जाने के लिए एक अलग प्रक्रिया चलाने का सुविज्ञ नुकसान है। यह निम्नलिखित विकल्पों के साथ एक समस्या नहीं है।

  • कई मूल Win32 touchआदेशों में से एक का उपयोग करें जिसे लोगों ने लिखा और प्रकाशित किया है। उनमें से कई लोगों ने अपने findचारों ओर लपेटने के लिए यूनिक्स की आवश्यकता के बिना, पुनरावृत्ति करने के लिए विकल्पों का समर्थन किया। (वे, सब के बाद, एक उपयोगकर्ताबेस को लक्षित कर रहे हैं जो एक touchकमांड की तलाश कर रहा है क्योंकि इसमें पोर्ट यूनिक्स कमांड का पूरा भार नहीं है।) ऐसा ही एक स्टीफन डुगुए का हैtouch , जैसा कि आप देख सकते हैं कि एक --recursiveविकल्प है।

  • CMD के रहस्यमय रहस्यों के साथ चतुर हो जाओ। जैसा कि अन्य उत्तर में उल्लेख किया गया है, कमांड COPY /B myfile+,,के अल्प-ज्ञात "प्लस" सिंटैक्स का उपयोग करके एक फ़ाइल के अंतिम संशोधन डेटस्टैम्प को अपडेट करेगा COPY(अधिक जिस पर यहां पाया जा सकता है , संयोग से)। यह निश्चित रूप FOR /Rसे ऑपरेशन को फिर से करने के लिए जोड़ा जा सकता है , जैसा कि यहां एक अन्य उत्तर में संकेत दिया गया है।

  • एक प्रतिस्थापन कमांड दुभाषिया का उपयोग करें और सीएमडी की तुलना में कम चालाक और अधिक सीधा हो। JP Software का TCC / LE एक ऐसा है। यह अपने कमांड में एक /Sविकल्प जोड़ता है , जिसका अर्थ है कि एक आवरण की आवश्यकता को समाप्त करने के लिए "प्लस" सिंटैक्स के साथ उपयोग कर सकता है । लेकिन यह वास्तव में अभी भी अपने आप के लिए जीवन को अनावश्यक रूप से कठिन बना रहा है, यह देखते हुए कि टीसीसी / एलई को एक निर्माण में बनाया गया है जो सीधे एक विकल्प का समर्थन करता है।COPYCOPY /SFOR/S


2
+1, जाने COPY /B file+,,का रास्ता है, इसके लिए किसी अतिरिक्त की आवश्यकता नहीं है ... :-)
तमारा विज्समैन

3
(ls file).LastWriteTime = DateTime.now
पॉवरशेल

5

चूंकि वे आसानी से उपलब्ध हैं, मैं अनएक्सूटिल्स का लाभ उठाने की सलाह दूंगा । इनमें वे कमांड findऔर touchकमांड शामिल हैं जो इसे बहुत आसान बनाएंगे।

सबसे ऊपरी निर्देशिका में बदलने के बाद आप संशोधित करना चाहते हैं:

खोजो। -Type f -exec स्पर्श {} +

5

केवल मौजूदा विंडोज कार्यक्षमता का उपयोग करने के लिए (कुछ भी स्थापित करने के लिए अतिरिक्त नहीं) इनमें से एक का प्रयास करें:

forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"  

(निर्दिष्ट पथ में शुरू होने वाली सभी फ़ाइलों को पुन: "स्पर्श" करें)

या

forfiles /S /C "cmd /c Copy /B @path+,,"   

(वर्तमान निर्देशिका में शुरू होने वाली सभी फ़ाइलों को "स्पर्श करें"


3
-1 के रूप में इन आदेशों सबफ़ोल्डर से रूट करने के लिए फ़ाइलों की प्रतिलिपि है और परिणाम एक गड़बड़ है।
टोनीजी

1
+1 @GonyG ने जो कहा उसे ठीक करने के लिए एक छोटा मोड़: forfiles / S / C "cmd / c कॉपी / B nul: + ,,"
एलेक्स डुपॉज़


4

मुझे पता है कि यह शायद थोड़ा बहुत देर हो चुकी है, लेकिन फिर भी, मैं अपना जवाब अभी छोड़ दूंगा जब किसी और को उसी चीज की जरूरत होगी।

जॉन टी का जवाब मेरे लिए विंडोज 7 पर काम नहीं करता था। कुछ शोध के बाद मुझे एसकेटीस्टैम्प नाम की यह उपयोगिता मिली , जो पूरी तरह से काम करती है।

यहाँ यह कैसे काम करता है पर अधिक विवरण के साथ एक लेख है: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -अनुकूलित /

यहां वे चरण हैं जिन्हें आपको करने की आवश्यकता है:

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

देखा! आपकी सभी फाइलें अपडेट हो चुकी हैं! किसी भी यूनिक्स बर्तन या कमांड लाइन की आवश्यकता नहीं है।


1

या आप पहले से ही विंडोज में निर्मित टूल का उपयोग कर सकते हैं, जब आपके पास पहले से ही किसी प्रकार का "टच" टूल है:

for /r %i in (C:\Path\To\Root\*) do @touch "%i"

या

forfiles /P C:\Path\To\Root /S /C "touch @file"

(एनबी: यदि आप बैच फ़ाइल से ऐसा कर रहे हैं और forकमांड का उपयोग करना चाहते हैं , तो अपने चर के लिए दोहरे प्रतिशत संकेतों का उपयोग करना सुनिश्चित करें। (जैसे %%iइसके बजाय %i)


1

यह मेरे लिए विंडोज 7 पर भी विफल रहा। मैंने अलग सिंटैक्स का उपयोग किया और इसे काम करने के लिए मिला:

forfiles /c "cmd /c touch @file"

ध्यान दें, मैंने पुनरावर्ती विकल्प का उपयोग नहीं किया।


1

पॉवरशेल का उपयोग करना:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

यह मेरे लिए काम नहीं करता है:The property 'LastWriteTime' cannot be found on this object.
बेन एन

इसने विंडोज सर्वर 2012 में मेरे लिए काम किया: (ls। \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves

0

ऊपर जॉन टी के जवाब के संदर्भ में:

मैं find' a ' \;और 'a +' के साथ कमांड को समाप्त करने के बीच के अंतर को समझने की कोशिश कर रहा था (मुझे बाद का पता नहीं था)।

यह उपयोगी था: ( यहाँ से )

-exec command ;
निष्पादित आदेश; सच है अगर 0 स्थिति वापस आ गई है। निम्नलिखित सभी तर्कों को ''; सामना किया है। स्ट्रिंग '{}' को वर्तमान फ़ाइल नाम से बदल दिया जाता है जिसे हर जगह संसाधित किया जाता है यह कमांड के तर्कों में होता है, न कि केवल उन तर्कों में जहां यह अकेला है, जैसा कि कुछ संस्करणों में पाया जाता है।

-exec command {} +
-Exec कार्रवाई का यह संस्करण चयनित फ़ाइलों पर निर्दिष्ट कमांड चलाता है, लेकिन कमांड लाइन अंत में प्रत्येक चयनित फ़ाइल नाम को जोड़कर बनाया गया है; कमांड की कुल संख्याओं की संख्या मिलान की गई फ़ाइलों की संख्या से बहुत कम होगी। कमांड लाइन उसी तरह से बनाई गई है जिस तरह से xargs अपनी कमांड लाइन बनाता है। कमांड के भीतर '{}' के केवल एक उदाहरण की अनुमति है। कमांड को प्रारंभिक निर्देशिका में निष्पादित किया जाता है।

c:\myfolder2 फ़ाइलों वाले फ़ोल्डर पर विचार करें a.txtऔरb.txt

  1. find . -type f -exec touch {} +के रूप में व्याख्या की है:
    touch a.txt b.txt
    यह जिस तरह से xargs काम करता है

  2. जबकि find . -type f -exec touch {} \;इसकी व्याख्या इस प्रकार है:
    touch a.txt
    touch b.txt

इस प्रकार, # 1 बहुत तेज है (लेकिन यह भी सीमा से ग्रस्त है कि निम्नलिखित कमांड execमें केवल एक ही {}प्लेसहोल्डर हो सकता है)।


अच्छी जानकारी के साथ शानदार टिप्पणी, लेकिन सवाल का जवाब नहीं। अगर यह एक टिप्पणी होती तो +1 करना होता।
टोनीजी

1
:) मुझे यह पोस्ट बनाने की कोई याद नहीं है :)
आशुतोष जिंदल

0

वर्तमान निर्देशिका और सभी उप-निर्देशिकाओं के लिए PowerShell का उपयोग करना:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

या आप इसके ठीक बाद एक फ़ोल्डर निर्दिष्ट कर सकते हैं dir

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