फ़ाइल नाम में "2015" के साथ एक दिन से अधिक पुरानी फ़ाइलों को कैसे सूचीबद्ध करें?


11

मैं उन सभी लॉग फाइलों को सूचीबद्ध करना चाहता हूं जो आज की नहीं हैं और केवल उन फाइलों की हैं 2015जिनके नाम हैं।

ये मेरे द्वारा किए गए आदेश हैं:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

दोनों से आउटपुट कुछ भी नहीं है, लेकिन फिर भी, फाइलें हैं। इन आदेशों के साथ कुछ गलत है, और मुझे नहीं मिल रहा है। किसी भी सहायता की सराहना की जाएगी।


findहिस्सा मेरे लिए अच्छा लग रहा है, लेकिन मैं यह भी साथ समस्या नहीं थी -execपैरामीटर। मुझे वह काम भी नहीं मिला। (मैं इसके माध्यम से मूल फ़ोल्डर में एक फ़ोल्डर से सभी jpg फ़ाइलों को स्थानांतरित करने की कोशिश कर रहा था - और इसे मैन्युअल रूप से कर रहा हूं ...)
बाइट कमांडर


@steeldriver मुझे लगता है कि वास्तव में यहाँ क्या गलत हो रहा है, क्योंकि अगर 2015उनके नाम के साथ वर्तमान निर्देशिका में फाइलें थीं (जिस तरह से कमांड लिखा गया है, उस तरह की अन्य स्पष्ट कमी) मुझे संदेह है कि किसी प्रकार का आउटपुट होगा। तो आप उस बारे में जवाब पोस्ट करना चाह सकते हैं।
एलियाह कगन

जवाबों:


18

कमांड find . -name '*2015*' -mmin +1440 -lsशायद वही करेगा जो आप चाहते हैं। जानकारी के लिए नीचे देखें।

आपकी पहली आज्ञा थी -name 2015। यह काम नहीं किया क्योंकि यह केवल उन फ़ाइलों को खोजता है जिनके नाम बिल्कुल हैं 2015 , उनमें कोई अन्य वर्ण नहीं है।

आपका दूसरा आदेश, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;कुछ कारणों से विफल हो सकता है:

1.* खोल से अयोग्य पात्रों का विस्तार किया जाता है, फिर इन्हें पास किया जाता है find

यदि वर्तमान निर्देशिका में कोई भी फाइल सीधे सम्‍मिलित है (आप जिस समय आप उस find ...कमांड को चलाते हैं ) जिसका नाम सम्‍मिलित है 2015(और .उसके साथ शुरू नहीं होता है ), तो शेल*2015* उन फ़ाइल नाम की सूची में विस्‍तारित हो गया, फिर पास किया गया उस सूची को तर्क के रूप में find। यह वह नहीं है जो आप चाहते हैं - इसके बजाय, आप *2015*शाब्दिक रूप से खोजने के लिए एक तर्क के रूप में पारित करना चाहते हैं, ताकि find, और न कि शेल, यह पता लगा सके कि कौन सी फाइलें इससे मेल खाती हैं।

उस समस्या को ठीक करने के लिए, बोली *2015*। इसे करने के तीन सामान्य तरीके हैं:

  • '*2015*'(अर्थात find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;)
  • "*2015*"(अर्थात find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;)
  • \*2015\*(अर्थात find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;)

मैं सुझाव है कि इसे लिखने एकल उद्धरण के साथ के रूप में '*2015*', क्योंकि:

लेकिन इस मामले में यह वास्तव में मायने नहीं रखता है। 'और "दोनों *एक ही व्यवहार करते हैं और अभिव्यक्ति \को समझना मुश्किल बनाने के लिए उद्धरण के लिए पर्याप्त जटिल नहीं है ।

2. -mtime +1केवल दो या दो दिन पहले संशोधित फ़ाइलों का चयन करता है ।

जैसा man findकहता है:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

मान लीजिए कि 47 घंटे पहले किसी फ़ाइल को संशोधित किया गया था। कितने 24 घंटे की अवधि है कि, यह पता लगाने की findदौर नीचे : यह है एक 24 घंटे की अवधि पहले। लेकिन -mtime +1केवल उन्हीं फाइलों से मेल खाता है, जिनका संशोधन समय 24 घंटे की अवधि से पहले कड़ाई से अधिक है । इस प्रकार कल से फ़ाइलें मेल नहीं खाती हैं।

क्यों देखें -mtime +1 केवल 2 दिनों से अधिक पुरानी फ़ाइलों को लौटाता है? अधिक जानकारी के लिए, जैसा कि स्टीलड्राइवर द्वारा सुझाया गया है

फ़ाइलें ढूंढने के लिए अंतिम बार संशोधित किसी भी समय की तुलना में अधिक 24 घंटे पहले , मैं बजाय के रूप में यह तय करने का सुझाव 1440 मिनट पहले साथ -mmin +1440:

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

कुछ पाठक सोच रहे होंगे कि मैंने क्यों नहीं बोली {}। कुछ लोग {}मनुष्यों को याद दिलाने के लिए उद्धृत करते हैं कि यह ब्रेस विस्तार के लिए एक अभिव्यक्ति नहीं है । बॉर्न-शैली के गोले (जैसे बाश ) को उद्धृत करने की आवश्यकता नहीं है {}। हो सकता है कि कुछ गैर-बॉर्न-शैली शेल विशेष रूप से इसका इलाज करते हैं; हो सकता है कि कुछ उपयोगकर्ता इसे उद्धृत करें। लेकिन यह भी एक गलत धारणा है कि किसी को कभी-कभी उद्धरण देना चाहिए {}ताकि -execरिक्त स्थान के साथ फ़ाइल नाम को सही ढंग से संभाल सके। यह गलत है: के साथ {}या '{}', findएक ही तर्क मिलता है, जैसा कि शेल पास होने से पहले उद्धरण हटाता'{}' हैfind। इस ग़लतफ़हमी का मुकाबला करने के लिए, मैं बोली नहीं देता {}, लेकिन यह स्टाइल की बात है - यदि आप {}यह दस्तावेज़ करना पसंद करते हैं कि शेल कैसे व्यवहार नहीं कर रहा है {और }विशेष रूप से, यह ठीक है।

मैं सुझाव है कि आप भी या तो अपने को बदलने के lsआदेश, या (के रूप में muru का सुझाव दिया है ) के साथ बदलने findकी -lsकार्रवाई। ls -ltrhसंभवत: आप जो इरादा कर रहे हैं वह नहीं कर रहे हैं क्योंकि यह पाया गया प्रत्येक फ़ाइल के लिए अलग-अलग चलाया जाता है और इस प्रकार -tऔर -rझंडे, जो सॉर्टिंग निर्दिष्ट करते हैं, अप्रासंगिक हैं।

हालाँकि आउटपुट थोड़े अलग तरीके से तैयार किया जाएगा ls -l, इसका उपयोग -lsकरना सरल और आसान है।

find . -name '*2015*' -mmin +1440 -ls

या यदि आप तय करते हैं कि आपको वास्तव में केवल फ़ाइल के नाम (उनके पथ, रिश्तेदार सहित .) को सूचीबद्ध करने की आवश्यकता है , तो आप बस कोई कार्रवाई निर्दिष्ट नहीं कर सकते हैं, जिससे डिफ़ॉल्ट -printकार्रवाई का उपयोग किया जा सकता है:

find . -name '*2015*' -mmin +1440

1
अच्छा पूरी तरह से जवाब! कम से कम जीएनयू के साथ, वहाँ भी newerXYवाक्यविन्यास है, जो कैलेंडर तर्कों को स्वीकार करता है जैसे -newermt 'yesterday'और! -newermt 'yesterday'
स्टीलड्राइवर

आपको पता है कि ? आप कमाल के हैं। @
एलिया

धन्यवाद stell ड्राइवर, पता करने के लिए लिंक से बहुत अच्छी जानकारी thats। लेकिन मेरे मामले में जैसे-जैसे एप्लिकेशन लॉग होता है आवेदन की पुरानी फाइलों को संशोधित होने का कोई रास्ता नहीं मिला। धन्यवाद फिर से
rʒɑd

2

अभिव्यक्ति को कोट करें और मेरा सुझाव है कि आप कोष्ठक को भी उद्धृत करें

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

या

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

आपको उन फ़ाइलों को पास करने की आवश्यकता नहीं है जो आपको ls में मिलती हैं

find . -name "*2015*" -mtime +1

शायद का उपयोग कर प्रतिबंधित -type f? और अगर lsउपयोग करना है, तो उपयोग करने का सुझाव दें -ls
मूरू

1
यकीन है, सभी अच्छे सुझाव। मुझे यकीन नहीं है कि ओपी क्या चाहता है और मेरा मानना ​​है कि समस्या का स्रोत "-name" खोज पैटर्न के आसपास उद्धरणों की कमी है।
पैंथर

2

में zsh , तो आप उपयोग कर सकते हैं ग्लोब क्वालिफायर (यह एक अद्वितीय zsh सुविधा, इस तरह के बैश के रूप में अन्य के गोले में उपलब्ध नहीं है)।

ls -ltr *2015*(m+1)

यह केवल वर्तमान निर्देशिका में फ़ाइलों को सूचीबद्ध करता है; पुनरावर्ती निर्देशिकाओं का उपयोग करने के लिए , उपयोग करें

ls -ltr **/*2015*(m+1)

इसके साथ find, -name 2015केवल उन्हीं फाइलों को खोजता है जिनका नाम ठीक है 2015-name *2015*केवल तभी काम करता है जब कोई फाइल नहीं होती है जिसका नाम 2015वर्तमान निर्देशिका में होता है, क्योंकि शेल को लागू करने *2015*से पहले पैटर्न का विस्तार होता findहै। आपको पैटर्न उद्धृत करने की आवश्यकता है:

find -name '*2015*' -mtime +1 …

ध्यान दें कि दोनों find -mtime +1और zsh की *(m+1)फाइलें कम से कम 48 घंटे पुरानी हैं , आज की तुलना में पुरानी फाइलें नहीं। प्लस चिन्ह का अर्थ है "सख्ती से अधिक" और दिनों की संख्या नीचे है। उन फ़ाइलों को खोजने के लिए जो कम से कम 24 घंटे पुरानी हैं, का उपयोग करें -mtime +0या (m+0)

यदि आप उन फ़ाइलों को ढूंढना चाहते हैं जिन्हें पिछली बार कल या उससे पहले संशोधित किया गया था , तो आप विधेय केfind साथ उपयोग कर सकते हैं :-newermt

find -name '*2015*' ! -newermt 'today 0:00' …

Zsh में इस परीक्षण को करने का वास्तव में कोई सुविधाजनक तरीका नहीं है।

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