เหตุใดค้นหา -mtime +1 จึงส่งคืนไฟล์ที่เก่ากว่า 2 วันเท่านั้น


117

ฉันดิ้นรนที่จะปิดใจว่าทำไมการfindตีความหมายถึงการปรับเปลี่ยนไฟล์เป็นเท่าที่ควร โดยเฉพาะฉันไม่เข้าใจว่าทำไมไฟล์-mtime +1จึงไม่แสดงน้อยกว่า 48 ชั่วโมง

เป็นตัวอย่างการทดสอบฉันสร้างสามไฟล์ทดสอบที่มีวันที่แก้ไขแตกต่างกัน:

[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

ตามหน้า man สำหรับการค้นหาฉันเข้าใจว่านี่เป็นพฤติกรรมที่คาดหวัง:

 -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 วัน ไฟล์ที่มีอายุไม่เกิน (1.99) วันไม่ใช่> 1.
Octopus

คำตอบ:


87

คำตอบง่ายๆคือฉันเดาว่าการใช้งานการค้นหาของคุณเป็นไปตามมาตรฐาน POSIX / SuS ซึ่งบอกว่ามันต้องทำตัวแบบนี้ การอ้างอิงจากSUSv4 / IEEE Std 1003.1, 2013 Edition, "find" :

-mtime n
     หลักจะประเมินว่าเป็นจริงหากเวลาการแก้ไขไฟล์ถูกลบออก
     จากเวลาเริ่มต้นหารด้วย 86400 (ด้วยส่วนที่เหลือทิ้ง) คือ n

(ที่อื่นในเอกสารนั้นอธิบายว่าnสามารถจริงได้+nและความหมายของสิ่งนั้นว่า "มากกว่า")

(current_time - file_time) / 86400ว่าทำไมมาตรฐานกล่าวว่ามันจะมีลักษณะการทำงานที่ทางดีฉันเดายาวในอดีตโปรแกรมเมอร์ขี้เกียจหรือไม่ได้คิดเกี่ยวกับมันและเพิ่งเขียนรหัสซี เลขคณิต C จำนวนเต็มจะละทิ้งส่วนที่เหลือ สคริปต์เริ่มต้นขึ้นอยู่กับพฤติกรรมนั้นและดังนั้นจึงเป็นมาตรฐาน

พฤติกรรมสเป็คก็จะพกพาไปยังระบบสมมุติที่เก็บวันที่แก้ไขเท่านั้น (ไม่ใช่เวลา) ฉันไม่รู้ว่าระบบดังกล่าวมีอยู่จริงหรือไม่


3
ค้นหาถูกออกแบบมาอย่างชัดเจนเพื่อทำงานล้างข้อมูลเท่านั้น
Kjeld Flarup

84

อาร์กิวเมนต์ที่-mtimeถูกตีความเป็นจำนวนวันทั้งวันในอายุของไฟล์ -mtime +nหมายความว่าอย่างเคร่งครัดมากกว่า , -mtime -nหมายอย่างเคร่งครัดน้อยกว่า

โปรดทราบว่าด้วย Bash คุณสามารถใช้งานได้ง่ายขึ้น:

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

เพื่อค้นหาไฟล์ที่เก่ากว่าและใหม่กว่า 24 ชั่วโมงตามลำดับ

(นอกจากนี้ยังง่ายกว่าการพิมพ์ในอาร์กิวเมนต์ที่เป็นเศษส่วน-mtimeสำหรับเมื่อคุณต้องการความละเอียดเป็นชั่วโมงหรือนาที)


2
ในการแสดงรายการไฟล์เหล่านี้ (ปกติเท่านั้น) ที่มีขนาดที่มนุษย์สามารถอ่านได้และเรียงตามลำดับเวลาให้ทำ$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
Evgeni Sergeev

1
สิ่งนี้จะมีผลเช่นเดียวกันกับที่คำสั่งทั้งสองร่วมกันจะยังคงพลาดไฟล์ภายในหน้าต่างหนึ่งนาทีที่ 24 ชั่วโมงที่ผ่านมา
Octopus

1
$(())เป็นไวยากรณ์เลขคณิตของเชลล์ธรรมดาไม่เฉพาะเจาะจงกับ Bash, cf pubs.opengroup.org/onlinepubs/009695399/utilities/…
Josip Rodin

@JosipRodin ไม่ไม่จำเป็นต้องเป็นจริง! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. เนื่องจาก Bash เป็น SH แบบ "ขยาย" จึงสนับสนุนไวยากรณ์นี้ แต่เชลล์บางตัวไม่เช่น csh / tcsh
t0r0X

@ t0r0X จุดของฉันก็คือว่ามันไม่ bashism ที่ค่อนข้างจะทำงานในเส้นประและ zsh /bin/shและสิ่งอื่นที่ทำหน้าที่เป็นธรรมดา
Josip Rodin

45

ระยะเวลา 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

ขอบคุณฉันพยายามคิดว่าเหตุใด -mtime X จึงแตกต่างจาก -mtime + X
Vnge

ฉันคิดว่า + X หมายถึงกางเกงขาสั้นสำหรับ (X + 1, X + 2, X + 3, ... ) :)
Eric Zheng

18

ดังนั้นหากไฟล์คือ 1 วัน, 23 ชั่วโมง, 59 นาทีและ 59 วินาทีค้นหา -mtime +1 จะไม่สนใจสิ่งนั้นและเพียงแค่ถือว่ามันเหมือน 1 วัน 0 ชั่วโมง 0 นาทีและ 0 วินาที?

ใช่. อย่างที่man findพูดว่า "ส่วนที่เป็นเศษส่วนใด ๆ จะถูกละเว้น" หากคุณแบ่ง "1 วัน 23 ชั่วโมง 59 นาทีและ 59 วินาที" ถึง "24 ชั่วโมง" คุณอาจได้รับ 1.9999 แต่ส่วน 0.9999 จะถูกปล้นและไฟล์มีอายุเพียง 1 วัน


18

-mtime Nหมายถึงไฟล์ที่อายุAในวันตรงกับNA < N +1 กล่าวอีกนัยหนึ่งเลือกไฟล์ที่ถูกแก้ไขครั้งล่าสุดระหว่างNและN +1 วันที่ผ่านมา-mtime N

-mtime -Nหมายถึงไฟล์ที่อายุAตรงกับA < Nนั่นคือไฟล์ที่ถูกแก้ไขน้อยกว่าNวันที่ผ่านมา หักสังหรณ์ใจหมายถึงไฟล์ที่มีอายุตอบสนองN 1 ≤ ไฟล์เช่นการปรับเปลี่ยนอย่างน้อยN 1 วันที่ผ่านมา-mtime +N

ตัวอย่างเช่น-mtime 1เลือกไฟล์ที่ถูกแก้ไขระหว่าง 1 ถึง 2 วันที่ผ่านมา -mtime +1เลือกไฟล์ที่ถูกแก้ไขอย่างน้อย 2 วันที่ผ่านมา ที่จะได้รับการแก้ไขไฟล์อย่างน้อย 1 -mtime +0วันที่ผ่านมาการใช้งาน

คำอธิบาย“ ถูกแก้ไขครั้งล่าสุดเมื่อ 24 ชั่วโมงก่อน” เป็นเพียงการประมาณและไม่ชัดเจนมาก

หากคุณพบว่ากฎเหล่านี้จำยากให้ใช้ไฟล์อ้างอิงแทน

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

(ไวยากรณ์ "1 วันที่ผ่านมา" ต้องใช้ GNU touch)


3
คำอธิบายที่ดีควรเพิ่มสามย่อหน้าแรกในเอกสารประกอบของfind!
Melebius

4

ใช้ -mmin -amin ฯลฯ เพื่อรับผลลัพธ์ที่แน่นอน


6
-?minข้อโต้แย้งทำงานเหมือน-?timeข้อโต้แย้งยกเว้นนาทีแทนวัน พวกเขาไม่ได้ "แน่นอน" เช่นกัน
Gilles

-2

หากคุณต้องการไฟล์อายุ 48 ชั่วโมงอย่างแน่นอนไม่ใช่ 2 วันคุณควรเพิ่มคำสั่ง--daystartของคุณfindลงไป สิ่งนี้จะช่วยคุณ

find . type -f -daystart -mtime +1

5
ไม่มีครั้งแรกมัน-daystart(ส่วนขยายของ GNU) --daystartไม่ใช่ จากนั้น-daystartเพียงหมายถึงการเปรียบเทียบเวลากับจุดเริ่มต้นของวันนี้แทนที่จะเป็นเวลาปัจจุบันดังนั้น--daystart -mtime +1จะรายงานไฟล์ที่มีการแก้ไขมากกว่า 48 ชั่วโมง / 2 ชั่วโมงก่อนเริ่มต้นของวันนี้ดังนั้นโดยปกติไฟล์ที่ถูกแก้ไขอย่างหนักก่อนวันวาน .
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.