रुपीस: केवल टाइमस्टैम्प पर नकल करना


42

वर्तमान में मेरे पास दो निर्देशिका ए / और बी / हैं जो टाइमस्टैम्प के अपवाद के साथ हर मामले में समान हैं। इसलिए अगर मैं कमांड चलाता हूं:

rsync --dry-run -crvv A/ B/

तब सभी फाइलों को "uptodate" चिह्नित किया जाता है, जबकि कमांड:

rsync --dry-run -rvv A/ B/

दिखाता है कि सभी फाइलों को ए / बी / से कॉपी किया जाना है।

मेरा सवाल यह है: यह देखते हुए कि मुझे पता है कि फाइलें समान हैं (सामग्री के संबंध में), तो क्या कोई तरीका है (rsync या अन्यथा के माध्यम से) बी में फ़ाइलों के लिए टाइमस्टैम्प सेट करने के लिए / फ़ाइलों की टाइमस्टैम्प के समान होने के लिए ए / बी / ए से सभी फाइलों पर कॉपी किए बिना ए /?

धन्यवाद


यदि आप जानते हैं कि फाइलें समान हैं, तो आपको अपनी आवश्यकता की तारीख / समय टिकट प्राप्त करने के लिए उन पर प्रतिलिपि न करने के लिए अपने रास्ते से बाहर क्यों जाना चाहिए?
टिम

3
@ समय: शायद बहुत सारा डेटा है।
रिचर्ड

जवाबों:


75

उपयोग करना -t(टाइमस्टैम्प को संरक्षित करना ) और --size-onlyकेवल आकार की फाइलों की तुलना करेगा। यदि आकार मेल खाता है, तो rsync फ़ाइल की प्रतिलिपि नहीं बनाएगा, लेकिन चूंकि -tयह निर्दिष्ट किया गया है, यह गंतव्य फ़ाइल पर टाइमस्टैम्प को फिर से अपडेट किए बिना अपडेट करेगा।

सुनिश्चित करें कि -u(अपडेट) का उपयोग न करें क्योंकि यह उन फ़ाइलों को छोड़ देगा जो पहले से मौजूद हैं और टाइमस्टैम्प को पूरी तरह से अपडेट करना छोड़ दें।

मुझे मूल रूप से एक नई ड्राइव में फ़ाइलों का एक गुच्छा कॉपी करने के लिए rsync का उपयोग नहीं करने की समस्या थी, और इसलिए टाइमस्टैम्प को वर्तमान समय में अपडेट किया गया था। मैंने समय की एक सभ्य राशि में सब कुछ सही ढंग से सिंक करने के लिए नीचे दिए गए आदेश का उपयोग किया:

rsync -vrt --size-only /src /dest

2
मैं --existingनई फ़ाइलों की आकस्मिक प्रतियों को रोकने के लिए जोड़ने का भी सुझाव देता हूं ।
leden

1
ध्वज --archive(या -a) शामिल है -r, -tऔर अधिक :)
डोर

6

यदि आकार आकार से मेल खाते हैं, तो ssize- केवल rsync के कारण फ़ाइल टाइमस्टैम्प (और इसलिए फ़ाइल सामग्री) की तुलना करना छोड़ देगा। इसे -times के साथ मिलाने से टाइमस्टैम्प को लक्ष्य ट्री में क्लोन कर दिया जाएगा।


3

मुझे लगता है कि rsync इसे बनाने के लिए सही उपकरण है, लेकिन अगर आप चाहते हैं कि कुछ स्क्रिप्ट को ऐसा करने की तुलना में यह एक अच्छी शुरुआत दे सके।

आप इस तरह टाइमस्टैम्प (एसेस टाइम) के साथ एक फ़ाइल सूची प्राप्त कर सकते हैं:

find . -printf '"%p" %a\n' -type f > /tmp/times

और इससे उचित समय अद्यतन कमांड प्राप्त करें:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

यह एक पूरी स्क्रिप्ट नहीं है, लेकिन एक अच्छी शुरुआत है! :)


धन्यवाद। मुझे लगता है कि मैं शायद इस समय रुपये के साथ चिपका रहूंगा, लेकिन मैं निश्चित रूप से वेब पर जाऊंगा और आपकी स्क्रिप्ट के विभिन्न घटकों को सीखूंगा, क्योंकि यह भविष्य में उपयोगी हो सकता है।
आर्टेला

ऐसा लग रहा था कि वास्तव में मेरा समाधान है! मैं अपने संगीत पुस्तकालय में कुछ मेटा डेटा जोड़ते हुए समय को संरक्षित करना चाहता हूं। हालांकि, जाहिरा तौर पर यह फ़ाइल नामों में रिक्त स्थान को संभाल नहीं सकता है):
बर्कार्डो

2

टच कमांड के लिए संदर्भ के रूप में स्रोत (जैसे /path/to/source) निर्देशिका का उपयोग करें । बस cdअपने लक्ष्य निर्देशिका और करने के लिए

find -type f -exec touch -r /path/to/source/{} {} \;

आप rsync (अभी तक) के साथ उप-सेकंड टाइमस्टैम्प की प्रतिलिपि नहीं बना सकते।

यह निर्देशिका और छद्म फ़ाइलों के लिए भी काम करता है (बस हटाएं या बदलें -type f)


यह मेरे लिए उपयोगी था क्योंकि मुझे नकल करने के लिए atime की आवश्यकता थी। मैंने देखा कि यह समय की नकल नहीं करता है, जो मेरे मामले में ठीक था।
Snapfractalpop

बस 'टच' का मैनपेज पढ़ें। आप इस आदेश के साथ atime और माइम दोनों सेट कर सकते हैं।
knorke

हां, मैं जानता हूं कि आप इसका उपयोग कर सकते हैं touch -arलेकिन फिर भी यह समय को नहीं बदलता है। मुझे लगता है कि शायद ही कभी वांछित है।
Snapfractalpop

आह, मैं अब समस्या देख रहा हूं। धन्यवाद। हां, समय बदलना मुश्किल है और मुझे नहीं पता कि क्यों।
knorke

1

ठीक है, आप निश्चित रूप से एक स्क्रिप्ट लिख सकते हैं जो टाइमस्टैम्प को एक तरफ से पढ़ता है और फिर दूसरी तरफ उसी फ़ाइल पर इसे सेट करने के लिए स्पर्श का उपयोग करता है।

लेकिन संभावना है कि आप rsync को सभी फ़ाइलों को कॉपी करने की कोशिश करने की तुलना में अधिक समय लगेगा। बहुत कम डेटा वास्तव में स्थानांतरित किया जाएगा (केवल ब्लॉक हैश अगर फ़ाइलें वास्तव में समान हैं)। लेकिन हर फाइल का पूरा कंटेंट कम से कम हर तरफ पढ़ना होगा। तो आप डिस्क बैंडविड्थ या IOPS द्वारा सीमित हैं, इसमें कुछ समय लग सकता है। लेकिन फिर भी ऐसा करने के लिए स्क्रिप्ट लिखने और परीक्षण करने से शायद कम समय लगता है।


धन्यवाद, मैं rsync की इस विशेषता से अनजान था (यह विकिपीडिया में भी चर्चा की गई है)।
आर्टेला

0

मेरे जैसे लोगों के लिए जो फाइलों को संशोधित करने का इरादा रखते हैं और मूल टाइमस्टैम्प को बनाए रखना चाहते हैं (जैसे कि आप अपने मोबाइल लाइब्रेरी के मेटा टैग को अपडेट करते हैं)।

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

  1. पुराने टाइमस्टैम्प को संरक्षित करें । यह वर्तमान निर्देशिका से संचालित होता है, सभी छिपी हुई फ़ाइलों को छोड़कर, और इसे अस्थायी फ़ाइल में सहेजता है /tmp/files। आप हमेशा मापदंडों को बदल सकते हैं, लेकिन -printf '"%t" "%p"\n'बाद में touchआदेश का उपयोग करने के बाद से बेहतर रहना चाहिए ।

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. अपनी फ़ाइलों को जितना चाहें संशोधित करें

  3. अब एक फाइल बनाएं जो आपको टाइमस्टैम्प को पुनर्स्थापित करने में मदद करे:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. और अंत में पुरानी तारीखों को संशोधित फाइलों पर लागू करें

    sh job.sh

कैविएट: नाम रिक्ति, विशेष वर्ण वाली फ़ाइलों के लिए काम करता है, लेकिन उदाहरण के लिए $इसमें साइन वाली कोई फ़ाइल नहीं है।


अपने फ़ाइल नामों में बैकस्लैश के साथ (कुछ) समस्याओं से बचने के लिए, उपयोग करें read -r line। खैर, हमेशा केread साथ उपयोग करें -r। इसके अलावा, आप job.shप्रत्येक फ़ाइल के लिए खोलने से बच सकते हैं । बस कमांड के अंत में पुनर्निर्देशन while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
रखें

दूसरा कैविएट: यह स्क्रिप्ट टाइमस्टैम्प निर्देशिकाओं को स्थानांतरित नहीं करता है। (खैर, ओपी ने इसके लिए नहीं कहा।)
हैगेलो

0

विंडोज पर केवल टाइमस्टैम्प की नकल करने का सबसे अच्छा तरीका:

किसी भी फ़ाइल के अंतिम निर्मित / संशोधित / एक्सेस किए गए समय स्टाम्प को किसी अन्य को कॉपी करने के लिए, आप इसका उपयोग कर सकते हैं:

टच / सी / एम / ए / आर SourceFile DestFile

(टच का यह संस्करण Win32 कंसोल टूलबॉक्स http://www.stevemiller.net/apps/ का हिस्सा है )

रोबोकॉपी "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / XF / आर: 10 / डब्ल्यू: 5 / वी / ईटीए


-1

Rsync मैनुअल: man rsync-tऔर -Nस्विच को सूचीबद्ध करता है , वे साथ चलने लायक हो सकते हैं।


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