क्यों -mtime +1 केवल 2 दिनों से पुरानी फ़ाइलों को लौटाता है?


115

मैं चारों ओर मेरे मन लपेटो करने के लिए संघर्ष कर रहा हूँ क्योंfind की व्याख्या संशोधन बार फाइल जिस तरह से यह करता है। विशेष रूप से, मुझे समझ में नहीं आता कि -mtime +148 घंटे से कम पुरानी फाइलें क्यों नहीं दिखाई जाती हैं।

एक उदाहरण परीक्षण के रूप में मैंने विभिन्न संशोधित तिथियों के साथ तीन परीक्षण फाइलें बनाईं:

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

मैं फिर -mtime +1स्विच के साथ मिल गया और निम्नलिखित आउटपुट मिला:

[root@foobox findtest]# find -mtime +1
./foo3

मैंने तब -mmin +1440निम्न के साथ खोज की और निम्न आउटपुट प्राप्त किया:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

खोज के लिए मैन पेज के अनुसार, मैं समझता हूं कि यह अपेक्षित व्यवहार है:

 -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.

यह अभी भी मेरे लिए कोई मतलब नहीं है। इसलिए यदि कोई फ़ाइल 1 दिन, 23 घंटे, 59 मिनट और 59 सेकंड पुरानी है, तो find -mtime +1उस सभी को अनदेखा कर देती है और इसे उसी तरह मानती है जैसे यह 1 दिन, 0 घंटे, 0 मिनट और 0 सेकंड पुराना है? किस मामले में, यह तकनीकी रूप से पुराना नहीं है कि 1 दिन और अनदेखा कर दिया जाए?

गणना नहीं करता।


7
पहले तो यह मुझे बहुत मज़ेदार लगा, लेकिन जब आप समझते हैं कि यह पूर्णता के दिनों में एक फ़ाइल की आयु को मापता है, तो यह वही करता है जो आप चाहते हैं। यह 1 दिन पुरानी के बराबर फाइलें नहीं देगा। एक फ़ाइल जो int (1.99) दिनों पुरानी है वह नहीं है 1. 1.
Octopus

जवाबों:


86

ठीक है, सरल उत्तर है, मेरा अनुमान है कि आपका खोज कार्यान्वयन POSIX / SuS मानक का अनुसरण कर रहा है, जो कहता है कि इसे इस तरह से व्यवहार करना चाहिए। SUSv4 / IEEE Std 1003.1, 2013 संस्करण से उद्धृत , "ढूंढें" :

-इस दौरान n
     प्राथमिक रूप से सही का मूल्यांकन किया जाएगा यदि फ़ाइल संशोधन समय
     86400 (किसी भी शेष छोड़ दिया गया) के साथ विभाजित प्रारंभिक समय से घटाया गया है, तो n है।

(उस दस्तावेज़ में कहीं और यह बताता है कि nवास्तव में हो सकता है +n, और इसका अर्थ "से अधिक" है)।

जैसा कि मानक कहता है कि यह उस तरह से व्यवहार करेगा - ठीक है, मैं अनुमान लगाता हूं कि अतीत में एक प्रोग्रामर आलसी था या इसके बारे में नहीं सोच रहा था, और बस सी कोड लिखा था (current_time - file_time) / 86400। C पूर्णांक अंकगणितीय शेष को जोड़ता है। उस व्यवहार के आधार पर लिपियों की शुरुआत हुई और इस प्रकार इसे मानकीकृत किया गया।

नमूना व्यवहार भी एक काल्पनिक प्रणाली के लिए पोर्टेबल होगा जो केवल एक संशोधन तिथि (समय नहीं) संग्रहीत करता है। मुझे नहीं पता कि क्या ऐसी प्रणाली अस्तित्व में है।


2
स्पष्ट रूप से केवल सफाई कार्य करने के लिए डिज़ाइन किया गया था।
Kjeld Flarup

83

तर्क को फ़ाइल की आयु में पूरे दिन-mtime की संख्या के रूप में व्याख्या की जाती है। से अधिक सख्ती से मतलब है , सख्ती से कम का मतलब है।-mtime +n-mtime -n

ध्यान दें कि बैश के साथ, आप अधिक सहज ज्ञान युक्त कर सकते हैं:

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

क्रमशः 24 घंटे से अधिक पुरानी और नई फ़ाइलों को खोजने के लिए।

( -mtimeजब आप घंटों या मिनटों में रिज़ॉल्यूशन चाहते हैं, तो इसके लिए एक आंशिक तर्क टाइप करना आसान है ।)


2
मानव-पठनीय आकारों के साथ और कालानुक्रमिक क्रम में उन फाइलों (नियमित रूप से) को सूचीबद्ध करने के लिए,$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
एवेरेनी सर्गेव

1
इसका भी एक ही प्रभाव होगा कि दोनों कमांड एक साथ 24 घंटे पहले उस एक मिनट की खिड़की के अंदर फाइलों को याद करेंगे।
ऑक्टोपस

1
$(())सादे खोल अंकगणितीय वाक्यविन्यास है, यह बैश, सीएफ के लिए विशिष्ट नहीं है। pubs.opengroup.org/onlinepubs/009695399/utilities/…
जोसिप रोडिन

@ जोसिपोडिन नहीं, जरूरी नहीं कि सच हो! This chapter describes the syntax of that command language as it is used by the sh utility and [...]। चूंकि बैश एक "विस्तारित" एसएच है, यह इस सिंटैक्स का समर्थन करता है, लेकिन कुछ अन्य गोले नहीं हैं, उदाहरण के लिए csh / tcsh।
t0r0X

@ t0r0X मेरी बात यह थी कि यह एक बशीवाद नहीं है, बल्कि, यह पानी का छींटा और zsh में काम करता है और जो कुछ भी एक पारंपरिक के रूप में कार्य करता है /bin/sh
जोसिप रॉडिन

43

आंशिक 24-घंटे की अवधि को काट दिया जाता है! इसका मतलब है कि "find -mtime +1" दो या दो दिन पहले संशोधित फ़ाइलों से मेल करने के लिए कहता है।

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

निम्नलिखित केवल GNU पर काम कर सकता है?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

धन्यवाद, मैं यह जानने की कोशिश कर रहा था कि क्यों-समय X अलग था -mtime + X
Vnge

मेरा मानना ​​है कि + X का अर्थ है (X + 1, X + 2, X + 3, ...)। :)
एरिक झेंग

18

इसलिए यदि कोई फ़ाइल 1 दिन, 23 घंटे, 59 मिनट और 59 सेकंड पुरानी है, तो -mtime +1 उस सभी को अनदेखा कर देता है और सिर्फ यह मान लेता है कि यह 1 दिन, 0 घंटे, 0 मिनट और 0 सेकंड पुराना है?

हाँ। जैसे man findकहते हैं, "किसी भी अंश को अनदेखा किया जाता है"। यदि आप "24 घंटे" के माध्यम से "1 दिन, 23 घंटे, 59 मिनट, और 59 सेकंड" विभाजित करते हैं, तो आपको 1.9999 मिल सकता है, लेकिन .9999 हिस्सा तब छीन लिया जाता है और अचानक फ़ाइल केवल 1 दिन पुरानी हो जाती है।


18

-mtime Nफ़ाइलें जिनकी उम्र का मतलब है एक दिन में संतुष्ट एनएक < एन +1। दूसरे शब्दों में, उन फाइलों का चयन करता है जिन्हें अंतिम बार N और N +1 के बीच संशोधित किया गया था।-mtime N

-mtime -Nफ़ाइलें जिनकी उम्र का मतलब है एक को संतुष्ट करता है एक < एन , यानी फ़ाइलों की तुलना में कम संशोधित एन दिन पहले। कम सहज, फ़ाइलें जिनकी उम्र का मतलब है एक संतुष्ट एन +1 ≤ एक , यानी फ़ाइलें कम से कम संशोधित एन +1 दिन पहले।-mtime +N

उदाहरण के लिए, उन -mtime 1फ़ाइलों का चयन करता है जिन्हें 1 और 2 दिन पहले संशोधित किया गया था। -mtime +1उन फ़ाइलों का चयन करता है जिन्हें कम से कम 2 दिन पहले संशोधित किया गया था। फ़ाइलों को कम से कम 1 दिन पहले संशोधित करने के लिए, उपयोग करें -mtime +0

विवरण "अंतिम बार n * 24 घंटे पहले संशोधित किया गया था" केवल एक अनुमान है, और बहुत स्पष्ट नहीं है।

यदि आपको इन नियमों को याद रखना मुश्किल है, तो इसके बजाय एक संदर्भ फ़ाइल का उपयोग करें।

touch -d '1 day ago' cutoff
find . -newer cutoff

(वाक्यविन्यास "1 दिन पहले" के लिए GNU की आवश्यकता होती है touch।)


3
अच्छा विवरण, पहले 3 पैराग्राफ के प्रलेखन में जोड़ा जाना चाहिए find!
मेलेबियस

4

सटीक परिणाम प्राप्त करने के लिए, -मिन, आदि का उपयोग करें


6
-?minतर्क बिल्कुल की तरह काम -?timeदिन के बजाय मिनट के साथ छोड़कर तर्क। वे या तो "सटीक" नहीं हैं।
गिल्स

-2

यदि आप ठीक 48-घंटे पुरानी फ़ाइलें चाहते हैं, 2 दिन नहीं, तो आपको --daystartअपनी findकमांड में जोड़ना चाहिए । इससे आपको मदद मिलेगी।

find . type -f -daystart -mtime +1

5
नहीं, पहले यह -daystart(एक GNU एक्सटेंशन) है, नहीं --daystart। फिर, -daystartवर्तमान समय के बजाय आज की शुरुआत के साथ समय की तुलना करने का मतलब है, इसलिए --daystart -mtime +1उन फ़ाइलों की रिपोर्ट करेंगे जिन्हें आज की शुरुआत से 48 घंटों / 2 घंटे पहले संशोधित किया गया था, इसलिए आमतौर पर फाइलें जो कल से पहले दिन से पहले संशोधित की गई थीं ।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.