Linux: sử dụng find để định vị các tệp cũ hơn <date>


31

findcó hỗ trợ tốt cho việc tìm kiếm các tệp được sửa đổi ít hơn X ngày trước, nhưng làm cách nào tôi có thể sử dụng findđể định vị tất cả các tệp được sửa đổi sau một ngày nhất định?

Tôi không thể tìm thấy bất cứ điều gì trong findtrang man để làm điều này, chỉ để so sánh với thời gian tập tin khác hoặc để kiểm tra sự khác biệt giữa thời gian được tạo và bây giờ. Là tạo một tệp với thời gian mong muốn và so sánh với đó là cách duy nhất để làm điều này?


1
Điều này sẽ được hỏi tốt hơn trên SuperUser.com
Josh Brower

6
Tôi sẽ không kết thúc điều này: cũng có thể thú vị đối với sysadins.
splattne

Lệnh này là một phần của tập lệnh sao lưu, lấy tất cả mọi thứ từ / etc đã được thay đổi sau khi cài đặt trong các bản sao lưu hàng đêm của chúng tôi.
DrStalker

Chín tuổi và tôi chỉ chú ý khi kiểm duyệt một câu trả lời mới: tiêu đề và nội dung của câu hỏi này không nêu rõ. Tiêu đề yêu cầu 'tệp cũ hơn <ngày>' nhưng phần thân trạng thái 'được sửa đổi sau một ngày nhất định'. Tôi diễn giải 'sau' là mới hơn một ngày cụ thể, không cũ hơn.
Joffrey

Câu trả lời:


19

Nếu bạn chỉ có 'tập tin mới hơn' thì bạn có thể thực hiện cách giải quyết này:

touch -t 201003160120 some_file
find . -newer some_file

người đàn ông chạm vào:

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

Giả sử rằng cảm ứng của bạn có tùy chọn này (của tôi là cảm ứng 5.97).


48

Không, bạn có thể sử dụng chuỗi ngày / thời gian.

Từ man find:

Tham chiếu -newerXY
So sánh dấu thời gian của tệp hiện tại với tham chiếu. Đối số tham chiếu thường là tên của một tệp (và một trong những dấu thời gian của nó được sử dụng để so sánh) nhưng nó cũng có thể là một chuỗi mô tả thời gian tuyệt đối. X và Y là các phần giữ chỗ cho các chữ cái khác và các chữ cái này chọn thời điểm thuộc về cách sử dụng tham chiếu để so sánh.

          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

Thí dụ:

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

5
Tôi đang sử dụng Centos 5.2, sử dụng GNU find phiên bản 4.2.27 và nó không hỗ trợ tham số -newermt hoặc bất kỳ tham số nào khác ngoài "tập tin mới"
DrStalker

1
GNU findutils 4.3.3 và các hỗ trợ mới hơn -newerXY theo savannah.gnu.org/bugs/?11668
Philip Durbin

25

Không liên quan trực tiếp đến câu hỏi, nhưng có thể thú vị cho một số người vấp ngã ở đây.

lệnh find không hỗ trợ trực tiếp tham số -older để tìm tệp cũ hơn một số ngày bắt buộc, nhưng bạn có thể sử dụng câu lệnh phủ định (sử dụng ví dụ trả lời được chấp nhận):

touch -t 201003160120 some_file
find . ! -newer some_file

sẽ trả lại các tập tin hơn ngày cung cấp.


3
biên tập viên - có lẽ nó nên được hợp nhất vào câu trả lời được chấp nhận?
nEJC

giải pháp này là cách thanh lịch nhất để giải quyết loại vấn đề này :)
Labynocle

9
find <dir> -mtime -20

lệnh find này sẽ tìm các tệp được sửa đổi trong vòng 20 ngày qua.

  • mtime -> đã sửa đổi (atime = access, ctime = created)
  • -20 -> mất hơn 20 ngày tuổi (20 chính xác 20 ngày, +20 hơn 20 ngày)

Bạn acan thêm các giới hạn bổ sung như:

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

giống như trước đây, nhưng chỉ tìm thấy các tệp kết thúc bằng '.txt'.


5

Chỉ cần thêm vào - bạn thậm chí có thể sử dụng hai đối số newermt để tìm kiếm trong một khoảng thời gian:

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

để tìm tất cả các tập tin từ tháng 3 năm 2007.


1

Bạn có thể sử dụng một kịch bản như thế này

#!/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

Lưu nó trong $ PATH của bạn dưới dạng "mới hơn" và làm cho nó có thể thực thi được.

Sau đó, bạn có thể tìm thấy tệp được sửa đổi sau một ngày nhất định như thế này:

newerthan "2010-03-10"

hoặc là

newerthan "last year"

hoặc là

newerthan "yesterday"

Điều đó nên làm những gì bạn muốn. Tôi không nghĩ rằng có một cách được xây dựng để đạt được điều này nếu không.


Không cần thiết phải sử dụng bccho toán học số nguyên, Bash có thể làm điều đó : ((seconds = when - now)), đối số định dạng datecần có một dấu cộng date +%svà một số hệ thống có thể không códate -d
Tạm dừng cho đến khi có thông báo mới.

Đây là cho Centos 5.2. Mà không có -d. Hữu ích để biết về toán học số nguyên mặc dù.
Richard Holloway

1
find ! -newermt “<DATE>”

như thế này:

find ! -newermt “jan 01 2015” 

Điều này sẽ cung cấp cho bạn các tệp cũ hơn 01-01-2015 trong thư mục hiện tại của bạn.

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


Tôi chuẩn bị viết bình luận chào mừng bạn trên ServerFault và yêu cầu bạn xem xét lại việc đặt câu trả lời trùng lặp cho đến khi tôi nhận ra tiêu đề câu hỏi và nội dung nói những điều khác nhau: tiêu đề yêu cầu 'các tệp cũ hơn <date>' và trạng thái câu hỏi 'đã sửa đổi sau một ngày nhất định ', mà theo tôi là hai điều khác nhau. Có lẽ trong bài viết của bạn có thể làm rõ sự khác biệt và giải thích việc sử dụng phủ định. Cảm ơn bạn đã đóng góp và tôi sẽ gửi bình luận về câu hỏi để làm rõ. Cảm ơn bạn đã đóng góp!
Joffrey

0

nếu ngày của bạn được định dạng sao cho phù hợp để so sánh,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.