शेल स्क्रिप्ट - <तिथि> के बाद संशोधित सभी फाइलें प्राप्त करें


136

मैं इसे PHP में नहीं करूँगा इसलिए मुझे उम्मीद है कि शेल स्क्रिप्टिंग में कोई सभ्य व्यक्ति मदद कर सकता है।

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


14
अच्छा निर्णय यह PHP में नहीं है।
केड्र्स

1
आप php का सहारा लिए बिना किसी भी अच्छे शेल स्क्रिप्टिंग लैंग्वेज का उपयोग कर सकते हैं, जैसे कि अजगर, रूबी, पर्ल।
मई'09

3
@garrow यह वास्तव में PHP में एक RecursiveDirctoryIterator का उपयोग करके एक FilterIterator में एन्कोड किए गए काफी सरल होगा।
अरेटाफैक्टो

जवाबों:


136

की तरह सरल:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

जहां find . -mtime -1(पुनरावर्ती) वर्तमान निर्देशिका में सभी फाइलें पहले दिन संशोधित होंगी। आप भिन्नों का उपयोग कर सकते हैं, उदाहरण के लिए:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz

4
अपने फ़ाइल नामों में रिक्त स्थान से निपटने के लिए उपयोगकर्ता 104848 का उत्तर नीचे देखें
ब्रायन हेंक

8
एक मनमाना टाइमस्टैम्प को एक भिन्नात्मक, सापेक्ष समय में परिवर्तित करना न तो सही लगता है और न ही विशेष रूप से सुविधाजनक। का उपयोग कर नीचे समाधान -newermtहै बहुत अच्छे।
बॉबी जैक

5
निर्देशिकाओं के साथ एक संरचना में परिवर्तन के साथ किसी भी फाइल को निकालने की कोशिश करते समय, निर्देशिकाओं को स्वयं संशोधित किया जाता है, जिससे पूरा फ़ोल्डर संग्रहीत किया जाता है। -type fकेवल फ़ाइलों का चयन करने के लिए जोड़ें । यह फ़ोल्डर संरचना को बनाए रखता है, लेकिन केवल परिवर्तनों के साथ फ़ाइलों का बैकअप लेता है।
ब्रेंट

1
@BrianHenk user104848 उनके नाम बदल गया है, मैं बहुत यकीन है कि आप मतलब कर रहा हूँ (वर्तमान में) जेसन लूथर से इस सवाल का जवाब है, हालांकि
icc97

4
एक अनियंत्रित तारीख तक फाइलों को खोजने के लिए सवाल पूछता है। यह उत्तर है कि अतीत में कितने दिनों की मनमानी तरीके से फाइलें ढूंढनी हैं। मुझे नहीं लगता कि यह एक तारीख को एक दिन के डेल्टा में बदलने के लिए एक कदम जोड़ने के बिना स्वीकृत उत्तर होना चाहिए।
मार्क

91

यदि आपके पास जीएनयू है find, तो प्रासंगिक विकल्पों की एक विरासत है। केवल यह है कि उनके लिए इंटरफ़ेस तारकीय से कम है:

  • -mmin n (मिनटों में संशोधन का समय)
  • -mtime n (दिनों में संशोधन समय)
  • -newer file (संशोधन समय फ़ाइल के संशोधन समय से नया)
  • -daystart (वर्तमान समय से प्रारंभ समय को दिन के प्रारंभ तक समायोजित करें)
  • पहुँच समय और 'परिवर्तन' या 'निर्माण' समय के लिए प्लस विकल्प।

कठिन भाग एक समय से मिनटों की संख्या निर्धारित कर रहा है।

विचार करने लायक एक विकल्प: touchआवश्यक संशोधन समय की मुहर के साथ एक फ़ाइल बनाने के लिए उपयोग करें; इसके बाद उपयोग findकरें -newer

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

यह 2009-01-03T12: 31: 43 की तुलना में नई फ़ाइलों के लिए दिखता है। जाहिर है, एक स्क्रिप्ट में, /tmp/wotsitयह अद्वितीय बनाने के लिए पीआईडी ​​या अन्य मूल्य के साथ एक नाम होगा; और trapयह सुनिश्चित करने के लिए एक होगा कि उपयोगकर्ता द्वारा बाधित होने पर भी इसे हटा दिया जाए, और इसी तरह आगे भी।


65
इसके बजाय, आप -newermt '2009-01-03T12:31:43'केवल संदर्भ के लिए फ़ाइल बनाने की आवश्यकता से बचने के लिए उपयोग कर सकते हैं ।
माइकल मिर

@MichaelMior: दिलचस्प है - MacOS X 10.7.2 पर 'खोज' समर्थन करता है -newermt( -newerXYक्योंकि इसके अंतर्गत कई विकल्प हैं; X = m, Y = t इस मामले में)। जीएनयू (लगभग पुरातन) लिनक्स सिस्टम पर मुझे लगता है कि विकल्पों का समर्थन नहीं करता है, इसलिए यह अपेक्षाकृत हाल ही का आगमन है। सर उठाने के लिए धन्यवाद।
जोनाथन लेफ्लर

यह विकल्प जीएनयू में 4.4.2 में मौजूद है जिसे मैं अपने सिस्टम पर उपयोग कर रहा हूं।
माइकल मिओर

2
यह भी ध्यान दें कि जीएनयू को सापेक्ष समय के साथ ही समर्थन भी मिलता है, अर्थात। -newermt '-2 weeks'
सांयकाल

1
-newermt '2009-01-03T12:31:43'भयानक लग रहा है, लेकिन दुर्भाग्य से यह गलत समय क्षेत्र में सब कुछ की व्याख्या करने लगता है: lists.gnu.org/archive/html/bug-findutils/2012-12/msg00009.html
एंटोनी

35

आप इसे सीधे टार के साथ और भी बेहतर तरीके से कर सकते हैं:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

यह 1 जनवरी 2014, 18:00:00 की तुलना में नए को संपीड़ित करने के लिए टार को निर्देश देता है।


9
हुह ... मैं 1984 से यूनिक्स का उपयोग कर रहा हूं और यह कभी नहीं जानता था। हमेशा कुछ न कुछ सीखने को मिलता है।
जॉन

उस के कार्यान्वयन tarOS X और FreeBSD के साथ आते हैं --newerजो केवल -NGNU के लिए लंबा विकल्प है tar
निसेतमा

यह कमाल है ... मैं इसे केवल bzip के साथ काम करने के लिए प्राप्त कर सकता था, -vvvf और gz एक्सटेंशन का उपयोग नहीं कर रहा था ... लेकिन मैं कोई विशेषज्ञ नहीं हूं।
देल

17

यह कुछ संख्या में फ़ाइलों के लिए काम करेगा। यदि आप किसी भी पथ में रिक्त स्थान रखते हैं, तो आप "-print0" और "xargs -0" को शामिल करना चाहते हैं। यह उदाहरण पिछले 7 दिनों में संशोधित फ़ाइलों की तलाश करता है। पिछले 7 दिनों से पहले संशोधित किए गए लोगों को खोजने के लिए, "+7" का उपयोग करें।

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

जैसा कि यह पृष्ठ चेतावनी देता है, यदि बहुत सारे तर्क हैं, तो xargs टार कमांड को कई बार निष्पादित कर सकता है और "-c" ध्वज समस्या पैदा कर सकता है। उस मामले में, आप यह चाहते हैं:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

आप टार के साथ ज़िप्ड टार आर्काइव को अपडेट नहीं कर सकते हैं, इसलिए आपको इसे दूसरे चरण में bzip2 या gzip करना होगा।


1
दूसरे बिंदु के बारे में, आप ज़िप्ड अभिलेखागार को अपडेट करने के लिए ग्नू-सक्षम टार कमांड, जैसे ग्नू टार -z विकल्प का भी उपयोग कर सकते हैं।
सनकैट २००

या हाल ही में GNU tars में bzip का उपयोग करने के लिए 'j' विकल्प जोड़ें
HD1

3
जैसा कि मैंने जोनाथन के उत्तर के ऊपर कहा है, यह उन फ़ोल्डरों को हड़प लेगा, जिनमें बदलाव हैं, जिससे उनकी सभी फाइलें आयात की जा सकेंगी। -type fकेवल फ़ाइलों का चयन करने के लिए जोड़ें । यह फ़ोल्डर संरचना को बनाए रखता है, लेकिन केवल परिवर्तनों के साथ फ़ाइलों को बैकअप करता है / हाल ही में जोड़ा गया है।
ब्रेंट

12

यह पिछले 7 दिनों के भीतर संशोधित सभी फाइलों को दिखाना चाहिए।

find . -type f -mtime -7 -print

पाइप जो टार / ज़िप में है, और आपको अच्छा होना चाहिए।


3

लिनक्स के तहत अच्छी तरह से खोज आदेश के मैन पेज पढ़ने की कोशिश करें

man find

ऐसा कुछ होना चाहिए

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

और आपके पास है


3

आप पिछले दिनों की तुलना में बाद में संशोधित फ़ाइलों की एक सूची प्राप्त कर सकते हैं:

find . -mtime -x

फिर आपको परिणामी सूची में फ़ाइलों को टार और जिप करना होगा, जैसे:

tar czvf mytarfile.tgz `find . -mtime -30`

पिछले महीने के दौरान संशोधित सभी फ़ाइलों के लिए।


3
"-मटाइम x" फाइलों का मिलान बिल्कुल "x" दिनों से पहले किया गया है, "-माइम -x" का उपयोग करके "एक्स" दिनों की तुलना में कम संशोधित फाइलों से मिलान करें।
लांस रिचर्डसन

3

मैं बस 7 दिन पहले से सभी नई फ़ाइलों का बैकअप लेने के लिए निम्नलिखित करूंगा

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

ध्यान दें कि आप '7 दिन पहले' को किसी भी चीज़ से बदल सकते हैं जो आपकी ज़रूरत के हिसाब से हो

हो सकता है : date -d'yesterday' +"%d-%b"

या और भी : date -d'first Sunday last month' +"%d-%b"


2

इस स्क्रिप्ट में दी गई तारीख से पहले और बाद में दो मिनट की संशोधन तिथि वाली फाइलें मिलेंगी (और आप अपनी आवश्यकतानुसार शर्तों को बदल सकते हैं)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

उदाहरण के लिए आप से पहले दिए गए दिनांक केवल, आप बदल सकते हैं संशोधन दिनांक होने फ़ाइलें चाहते 120करने 0में $DIFF_IN_DATEपैरामीटर की शर्तों को त्यागकर $DIFF_IN_DATE1पैरामीटर।

इसी तरह आप संशोधन दिनांक होने फ़ाइलें 1 घंटे पहले और यदि उक्त समय के बाद, बस की जगह चाहते हैं, तो 120द्वारा 3600में if CONDITION

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