एक दिन की तुलना में नई फ़ाइलें खोजें और कॉपी करें


12

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

यह वही है जो मेरे पास है:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

उपरोक्त कोड स्रोत निर्देशिका में सभी फ़ाइलों की प्रतिलिपि बनाता है। अगर मैं 'cp' के सभी तर्कों को हटाता हूं तो यह काम करता है:

find . -mtime -1 -exec cp "{}" /somefolder \;

उपरोक्त कोड केवल नवीनतम फ़ाइलों की प्रतिलिपि बनाता है जैसा मैं चाहता हूं, लेकिन मुझे cp तर्कों का उपयोग करके विशेषताओं को संरक्षित करने की आवश्यकता है।

मैंने चर भी आज़माया है और यह सोचने के लिए कि शायद -सेक्स विकल्प मुद्दा था:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

हालाँकि, एक ही समस्या में परिणाम लूप के लिए ऊपर, सभी फ़ाइलों की प्रतिलिपि बनाई जाती है। यदि मैं $ फ़ाइलों को केवल उन फ़ाइलों को प्रतिध्वनित करता हूं जिनकी मुझे आवश्यकता है

में इससे कैसे चला सकता हूँ?


1
ठीक है, मुझे लगता है कि मैं इसका उपयोग कर काम कर रहा हूं:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
16:12 पर mac1234

क्या rpync cp के बजाय इस कार्य के लिए बेहतर उपकरण नहीं होगा? rsync -a स्रोत गंतव्य
डैरिल

जवाबों:


9

कुछ कार्यान्वयन में cpएक -tविकल्प है, इसलिए आप फ़ाइलों से पहले लक्ष्य निर्देशिका रख सकते हैं :

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

ध्यान दें कि -aइसका मतलब है --preserveतो मैंने बाद को हटा दिया।


यह भी पुरानी फ़ाइलों के साथ फ़ोल्डर्स की प्रतिलिपि बनाता है ...?
लुइस ए। फ्लोरिट

3

आप paxइस तरह के लिए उपयोग कर सकते हैं :

pax -wrT "11$(date +%H%M)," . /destination/folder

कमांड-लाइन बिट-बाय:

  • -wr- जब संस्कार और ead paxदोनों विकल्प दिए जाते हैं, तो यह कॉपी हो जाता है। संभवतः यहाँ भी उपयोगी है। (लेकिन उपरोक्त आदेश में शामिल नहीं)-w-r

    • -lस्याही - जो हार्ड-लिंक बनाता है अगर फ़ाइल-डेटा की प्रतिलिपि बनाने के बजाय सभी संभव हो।

    • -Xpaxएक ही स्रोत डिवाइस और / या फाइल सिस्टम के लिए सीमित करने के लिए।

    • -s/src regex/replace/ - जो इन-स्ट्रीम में फ़ाइल नाम को संशोधित करता है

    • -verbose - खट्टी / लक्षित फाइलों पर रिपोर्टिंग के लिए।

  • -T- -Tलक्ष्य संग्रह के लिए IME विकल्प का चयन करता फ़ाइलें (या केवल जब साथ प्रयोग किया कॉपी करने के लिए -wr) उनके आधार पर /modification या inode /cपरिवर्तित करें (या दोनों) बार। यह आधुनिक समय के लिए चूक है। से ...

आदमी पैक्स

  • ... समय की तुलना दोनों फाइल के समय का उपयोग करने के लिए उपयोगी है जब पैक्स का समय आधारित वृद्धिशील संग्रह बनाने के लिए उपयोग किया जाता है (केवल एक निर्दिष्ट समय सीमा के दौरान परिवर्तित की गई फ़ाइलों को संग्रहीत किया जाएगा)।

  • एक समय सीमा छह अलग-अलग क्षेत्रों से बनी होती है और प्रत्येक क्षेत्र में दो अंक होने चाहिए। प्रारूप है:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • कहाँ cc, वर्ष (सदी) के पहले दो अंकों का होता है yyसाल के अंतिम दो अंक है, पहले mmमहीने (01 से 12 तक), है ddमहीने (01 से 31) के दिन है, HHहै दिन का घंटे (00 से 23 तक), MMमिनट (00 से 59 तक) है, और SSसेकंड (00 से 59 तक) है। मिनट फ़ील्ड MMआवश्यक है, जबकि अन्य फ़ील्ड वैकल्पिक हैं और उन्हें निम्न क्रम में जोड़ा जाना चाहिए:

    HH, dd, mm, yy, cc

  • SSक्षेत्र अन्य क्षेत्रों की स्वतंत्र रूप से जोड़ा जा सकता है। समय सीमा वर्तमान समय के सापेक्ष है, इसलिए ...

    -T 1234/cm

  • ... आज या बाद में 12:34 PM के संशोधन या इनोड बदलने के समय के साथ सभी फाइलों का चयन करेंगे।

  • -Tपहले मैच के साथ कई बार रेंज की आपूर्ति की जा सकती है और स्टॉप की जाँच की जा सकती है।

... तो 11मेरे उदाहरण के क्रम में वहाँ आज के सापेक्ष है - यह आज की तारीख से एक कम है - जो बारहवीं है - और बाकी सिर्फ एक मानक "$(date)"प्रारूप है जिसके बाद अल्पविराम होता है।

... सिवाय - और अंतिम बात ध्यान देने योग्य है - मैं लक्ष्य निर्देशिका के लिए एक निरपेक्ष पथ का उपयोग करता हूं - और यदि आप ऐसा करते हैं तो आपको करना चाहिए। डॉक्स सभी सापेक्ष लक्ष्य पथों के लिए अनिर्दिष्ट व्यवहार का संदर्भ देता है - और जब तक मैंने कभी भी प्रयोग नहीं किया paxथा, तब तक मैंने कोशिश की थी कि जब तक मैं एक निरपेक्ष पथ का उपयोग नहीं करता, सभी अजीब परिणामों के साथ भ्रम में एक घंटे तक अपनी सांस के नीचे शपथ लेते रहे।


2

मदद के लिए हर किसी को धन्यवाद देता है, यह आपके सुझावों के संयोजन का उपयोग करके काम कर रहा है:

नीचे दिए गए कोड के साथ चला गया और यह पूरी तरह से काम करता है।

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

एक बार फिर धन्यवाद!


2

मैं बिल्कुल एक ही कार्यक्षमता कर रहा था, लेकिन फ़ोल्डर संरचना को संरक्षित करने की आवश्यकता थी। इसलिए मैंने जो किया है वह थोड़ा अलग है।

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

जहां $ दिन दिनों की संख्या है $ टारपथ इन फ़ाइलों को संग्रहीत करने के लिए अस्थायी मार्ग है। और जब मैं पुनर्स्थापित करना चाहता था।

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

जिसने मेरे लिए चाल चली है।

नोट: यदि आप बैकअप लेते समय कुछ फ़ोल्डर को बाहर करना चाहते हैं तो आप निम्न कमांड का उपयोग कर सकते हैं

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

लाभ: 1. मेरे पास हमेशा एक प्रतिलिपि होती थी जिसे मैंने पिछली बार संपीड़ित प्रारूप में बहाल किया था।

  1. इसके अलावा मेरी बहाली के बीच में एक ठहराव है जहां मैं जा सकता हूं और जांच सकता हूं कि वे फाइलें क्या हैं और यदि सब ठीक है तो स्क्रिप्ट के साथ आगे बढ़ें।

  2. यह फ़ोल्डर संरचना को संरक्षित करता है इसलिए यह स्रोत निर्देशिका से संशोधित फ़ाइलों को गंतव्य निर्देशिका में अधिलेखित कर देता है

नोट: दूसरी ओर यदि आवश्यकता दिन सीमित नहीं है तो मैं rsync का उपयोग करूंगा

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

यहाँ तारीख के साथ rsyc के लिए और अधिक


1

कोई निश्चित दिनों तक वापस जाने के अलावा सटीक तिथि और समय भी चुन सकता है

(यह केवल तभी काम करता है जब आपकी फ़ाइल के नाम में कोई स्थान, टैब या वाइल्डकार्ड न हो)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

उपरोक्त सभी फाइलें उस निर्देशिका की सभी फाइलों को कॉपी करती हैं जो 17 दिसंबर 2016 20:10:00 के बाद फोल्डर (आज से 1 दिन पहले) बनाई गईं :)

खोज कमांड के लिए प्रतीक के साथ सावधान रहें, यह यह नहीं है: 'यह यह है, एक बैकटिक: `तिथि चयन इस के साथ है:'

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

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


धन्यवाद स्टीफन, यही कारण है कि मैं किसी भी पद में यह नहीं मिल सकता है, हालांकि मेरे मामले के लिए यह एक आकर्षण की तरह काम किया। जब आप ऐसा करते हैं तो केवल यह पाते हैं। -Type f -newermt '17 dec 2016 20:10:00 '
फतहशारीगोल

... यह उस समय के बाद बनाई गई फ़ाइलों को प्रिंट करता है, मुझे यकीन नहीं है कि यह किस तरह का मुद्दा हो सकता है। तो मैं सिर्फ इन फ़ाइलों को कॉपी करने के लिए चयन करने के लिए backticks का उपयोग करता हूं। चीयर्स
फतिहशरीगोल

मेरा मानना ​​है कि आपके द्वारा साझा की गई पोस्ट "लूपिंग ओवर" के बारे में है, क्या मेरा कोड खोज परिणाम पर लूपिंग है? या यह सिर्फ कॉपी द्वारा उपयोग किए जाने वाले खोज के परिणाम का चयन कर रहा है? (3 टिप्पणियों के लिए क्षमा करें, मुझे अभी तक अपनी टिप्पणियों को संपादित करने की अनुमति नहीं है
FatihSarigol

1
का प्रयोग करें find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) या find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU या कुछ BSDs (सीमित कारक wrt पोर्टेबिलिटी -newermtयहाँ विधेय है))।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.