Linux: การใช้ find เพื่อค้นหาไฟล์ที่เก่ากว่า <วันที่>


31

findมีการสนับสนุนที่ดีสำหรับการค้นหาไฟล์ที่แก้ไขน้อยกว่า X วันที่แล้ว แต่ฉันfindจะใช้เพื่อค้นหาไฟล์ทั้งหมดที่แก้ไขหลังจากวันที่กำหนดได้อย่างไร

ฉันไม่พบสิ่งใดในfindman page ที่จะทำสิ่งนี้เพียงเพื่อเปรียบเทียบกับเวลาไฟล์อื่นหรือเพื่อตรวจสอบความแตกต่างระหว่างเวลาที่สร้างและตอนนี้ การทำไฟล์ด้วยเวลาที่ต้องการและเปรียบเทียบกับวิธีเดียวที่จะทำเช่นนี้?


1
สิ่งนี้จะถูกถามดีกว่าใน SuperUser.com
Josh Brower

6
ฉันจะไม่ปิดสิ่งนี้: น่าสนใจสำหรับ sysadmins เช่นกัน
splattne

คำสั่งนี้เป็นส่วนหนึ่งของสคริปต์สำรองซึ่งจะเก็บข้อมูลทุกอย่างจาก / etc ที่เปลี่ยนแปลงหลังการติดตั้งในการสำรองข้อมูลทุกคืน
DrStalker

อายุเก้าขวบและฉันเพิ่งสังเกตเห็นเมื่อกลั่นกรองคำตอบใหม่: ชื่อเรื่องและเนื้อหาของคำถามนี้ไม่เหมือนกัน ชื่อขอให้ 'ไฟล์ที่เก่ากว่า <วันที่>' แต่สถานะร่างกาย 'แก้ไขหลังจากวันที่แน่นอน' ฉันตีความ 'after' ว่าใหม่กว่าวันที่ที่ระบุไม่เก่ากว่า
Joffrey

คำตอบ:


19

หากคุณมีเพียง '-newer file' คุณสามารถแก้ไขปัญหานี้ได้:

touch -t 201003160120 some_file
find . -newer some_file

ผู้ชายสัมผัส:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

สมมติว่า Touch ของคุณมีตัวเลือกนี้ (ฉันคือ touch 5.97)


48

ไม่คุณสามารถใช้สตริงวันที่ / เวลา

จากman find:

-newerXY การอ้างอิง
เปรียบเทียบเวลาของไฟล์ปัจจุบันที่มีการอ้างอิง อาร์กิวเมนต์การอ้างอิงโดยปกติแล้วชื่อของไฟล์ (และหนึ่งในการประทับเวลาของมันจะใช้สำหรับการเปรียบเทียบ) แต่มันก็อาจจะเป็นสตริงที่อธิบายเวลาที่แน่นอน X และ Y เป็นตัวยึดตำแหน่งสำหรับตัวอักษรอื่นและตัวอักษรเหล่านี้เลือกเวลาที่เป็นของการอ้างอิงที่ใช้สำหรับการเปรียบเทียบ

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

ตัวอย่าง:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls

5
ฉันใช้ Centos 5.2 ซึ่งใช้ GNU ค้นหารุ่น 4.2.27 และไม่รองรับ - ใหม่หรือพารามิเตอร์ใด ๆ อื่นที่ไม่ใช่ "ไฟล์ -newer"
DrStalker

1
GNU findutils 4.3.3 และใหม่กว่ารองรับ -newerXY ตามsavannah.gnu.org/bugs/?11668
Philip Durbin

25

ไม่เกี่ยวข้องกับคำถามโดยตรง แต่อาจน่าสนใจสำหรับบางคนที่สะดุดที่นี่

คำสั่งfindไม่รองรับพารามิเตอร์ -older โดยตรงสำหรับการค้นหาไฟล์ที่เก่ากว่าวันที่ต้องการ แต่คุณสามารถใช้คำสั่ง negate (ใช้ตัวอย่างคำตอบที่ยอมรับ):

touch -t 201003160120 some_file
find . ! -newer some_file

จะคืนไฟล์ที่เก่ากว่าวันที่ให้


3
บรรณาธิการ - ควรรวมเข้ากับคำตอบที่ยอมรับหรือไม่
nEJC

วิธีนี้เป็นวิธีที่สง่างามที่สุดในการแก้ปัญหาชนิดนี้ :)
Labynocle

9
find <dir> -mtime -20

คำสั่ง find นี้จะค้นหาไฟล์ที่ถูกแก้ไขภายใน 20 วันที่ผ่านมา

  • mtime -> แก้ไขแล้ว (atime = access, ctime = created)
  • -20 -> น้อยกว่า 20 วัน (20 ว่า 20 วัน +20 มากกว่า 20 วัน)

คุณสามารถเพิ่มข้อ จำกัด เพิ่มเติมเช่น:

find <dir> -mtime -20 -name "*.txt"

เหมือนเดิม แต่จะค้นหาเฉพาะไฟล์ที่ลงท้ายด้วย '.txt'


5

เพียงเพื่อเพิ่ม - คุณอาจใช้อาร์กิวเมนต์สองข้อต่อไปนี้เพื่อค้นหาในช่วงเวลา:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

ค้นหาไฟล์ทั้งหมดตั้งแต่เดือนมีนาคม 2550


1

คุณสามารถใช้สคริปต์เช่นนี้

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

บันทึกไว้ใน $ PATH ของคุณเป็น "newerthan" และทำให้สามารถเรียกใช้งานได้

จากนั้นคุณสามารถค้นหาไฟล์ที่แก้ไขหลังจากวันที่ที่กำหนดเช่นนี้:

newerthan "2010-03-10"

หรือ

newerthan "last year"

หรือ

newerthan "yesterday"

ควรทำสิ่งที่คุณต้องการ ฉันไม่คิดว่าจะมีวิธีใดที่จะบรรลุเป้าหมายนี้ได้


ไม่จำเป็นต้องใช้bcสำหรับคณิตศาสตร์จำนวนเต็มทุบตีสามารถทำได้: ((seconds = when - now))อาร์กิวเมนต์รูปแบบที่dateควรมีเครื่องหมายบวกdate +%sและบางระบบอาจไม่มีdate -d
หยุดชั่วคราวจนกว่าจะมีประกาศเพิ่มเติม

นี่คือ Centos 5.2 ซึ่งจะมี -d มีประโยชน์ที่จะรู้เกี่ยวกับคณิตศาสตร์จำนวนเต็มว่า
Richard Holloway

1
find ! -newermt “<DATE>”

อย่างนี้:

find ! -newermt “jan 01 2015” 

สิ่งนี้จะให้ไฟล์ที่เก่ากว่า 01-01-2015 ในไดเรกทอรีปัจจุบัน

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/


ฉันกำลังจะเขียนความคิดเห็นต้อนรับคุณใน ServerFault และขอให้คุณพิจารณาคำตอบที่ซ้ำกันจนกว่าฉันจะรู้ว่าชื่อคำถามและเนื้อหาพูดในสิ่งที่แตกต่าง: ชื่อขอให้ 'ไฟล์เก่ากว่า <วันที่> และแก้ไขคำถาม' หลังจากวันที่แน่นอนซึ่งในความคิดของฉันเป็นสองสิ่งที่แตกต่างกัน บางทีคุณอาจจะโพสต์ของคุณชี้แจงความแตกต่างและอธิบายการใช้งานของการปฏิเสธ ขอบคุณสำหรับการบริจาคและฉันจะโพสต์ความคิดเห็นเกี่ยวกับคำถามเพื่อความกระจ่าง ขอบคุณสำหรับการสนับสนุน!
Joffrey

0

หากวันที่ของคุณอยู่ในรูปแบบที่เหมาะสมสำหรับการเปรียบเทียบ

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.