Làm cách nào để sử dụng 'find' để tìm kiếm các tệp được tạo vào một ngày cụ thể? [đóng cửa]


254

Làm cách nào để sử dụng lệnh UNIX findđể tìm kiếm các tệp được tạo vào một ngày cụ thể?


8
Có vẻ như các câu hỏi bash script được cho phép.
Alan

@MichaelScheper: Tôi thậm chí không biết bắt đầu từ đâu với nhận xét đó.
Các cuộc đua nhẹ nhàng trong quỹ đạo

1
@Notinlist: Đây là câu trả lời: meta.stackexchange.com/questions/10249/ , Thật không may, hóa ra giới hạn thời gian đã hết hạn. Đáng tiếc, vì các tìm kiếm trên web vẫn hạ cánh ở đây và câu trả lời được chấp nhận là hữu ích cho nhiều người.
Michael Scheper

@MichaelScheper: Nếu bạn có thể tìm thấy một tùy chọn bỏ phiếu để di chuyển sang unix.stackexchange.com, bằng mọi cách, hãy chỉ cho tôi biết. Vì bạn không có đại diện để xem hộp thoại đóng, tôi sẽ cho bạn một gợi ý: không có. Cân nhắc việc ít chiến đấu hơn khi bạn không biết bạn đang nói về cái gì. Cảm ơn đã quan tâm.
Các cuộc đua nhẹ nhàng trong quỹ đạo

5
@LightnessRacesinOrbit: Tôi xin lỗi vì đã đi qua với tư cách là 'chiến đấu'. Tôi không được phép chỉnh sửa nhận xét của mình, nhưng để tham khảo trong tương lai, đó có phải là nhận xét của tôi ca ngợi câu hỏi đã xúc phạm bạn không? Tôi phải nói rằng, tôi cảm thấy hơi mù quáng, ngay cả sau khi đưa ra nhận xét trước đó của bạn về lợi ích của sự nghi ngờ. Tôi thực sự đã cố gắng trở nên mang tính xây dựng hơn là thêm một 'tôi nữa', bằng cách tìm kiếm cách di chuyển hoạt động: meta.stackexchange.com/a/10250/249555 Giới hạn thời gian 60 ngày ẩn tùy chọn đó, có lẽ? Xin lỗi cho bum steer. Cảm ơn bạn một lần nữa, chân thành vì bạn đã dành thời gian và sự quan tâm của bạn.
Michael Scheper

Câu trả lời:


323

Như Max đã chỉ ra, bạn không thể, nhưng kiểm tra các tệp được sửa đổi hoặc truy cập không quá khó. Tôi đã viết một hướng dẫn về điều này, muộn như ngày hôm nay. Bản chất của nó là sử dụng -newerXY! -newerXY:

Ví dụ: Để tìm tất cả các tệp được sửa đổi vào ngày 7 tháng 6 năm 2007:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

Để tìm tất cả các tệp được truy cập vào ngày 29 tháng 9 năm 2008:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Hoặc, các tệp có sự cho phép của họ đã thay đổi trong cùng một ngày:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Tuy nhiên, nếu bạn không thay đổi quyền trên tệp, 'c' thường sẽ tương ứng với ngày tạo.


7
Phiên bản tìm kiếm của tôi (GNU 4.2.32) dường như không hỗ trợ các vị từ -newerXY. Có một phiên bản tối thiểu cụ thể cần thiết? Hoặc đó là một trường hợp biên dịch tìm với một chuyển đổi cấu hình đặc biệt?
yukondude

1
@yukondude: Bạn nói đúng. Phiên bản tìm kiếm tôi có cục bộ - GNU 4.4.0 - có nó, trong khi 4.1.20 mà tôi có trên Dreamhost thì không. Mặc dù vậy, việc tạo hai tệp sẽ hoạt động.
Arve

1
Trên một số hệ thống (FreeBSD, OS / X ...) -newerBtsẽ khớp với thời gian sinh (tạo) của tệp .
Stephane Chazelas

3
Lưu ý rằng bản -newerxtnày có sẵn trên FreeBSD từ năm 2001 (nơi nó được cung cấp lần đầu tiên dưới dạng bản vá vào năm 1998), một số BSD và GNU khác tìm thấy (kể từ 4.3.3 năm 2007), dựa trên tìm thấy HP / UX, được giới thiệu -newerXY(nhưng ở đâu Y == t không được hỗ trợ).
Stephane Chazelas

Sử dụng: find (GNU findutils) 4.4.0, cú pháp này không hoạt động trên SUSE ext3, nếu nó được liệt kê các tệp / w mtime vào ngày đó, nó sẽ trả về không có gì
niken

68

find location -ctime time_period

Ví dụ về time_apse:

  • Hơn 30 ngày trước: -ctime +30

  • Chưa đầy 30 ngày trước: -ctime -30

  • Chính xác là 30 ngày trước: -ctime 30


7
Vấn đề là tôi muốn kiểm tra một ngày cụ thể, không phải trong một khoảng thời gian.
sverrejoh

1
Vì vậy, hãy tìm ra cách đây bao nhiêu ngày và sử dụng số đó.
jmanning2k

15
ctimekhông liên quan gì đến thời gian tạo , đó là thời gian thay đổi inode.
Stephane Chazelas

47

Đó là hai bước nhưng tôi thích làm theo cách này:

Đầu tiên tạo một tập tin với một ngày / thời gian cụ thể. Trong trường hợp này, tệp là 2008-10-01 lúc nửa đêm

touch -t 0810010000 /tmp/t

Bây giờ chúng tôi có thể tìm thấy tất cả các tệp mới hơn hoặc cũ hơn tệp trên (theo ngày sửa đổi tệp. Bạn cũng có thể sử dụng -anewer cho trạng thái tệp đã truy cập và -cnewer đã thay đổi).

find / -newer /tmp/t
find / -not -newer /tmp/t

Bạn cũng có thể xem các tệp giữa các ngày nhất định bằng cách tạo hai tệp bằng cảm ứng

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Điều này sẽ tìm thấy các tập tin giữa hai ngày và thời gian

find / -newer /tmp/t1 -and -not -newer /tmp/t2

3
+1 cho giải pháp cho một người già findmà thiếu-newerXY
Felipe Alvarez

1
IMO, ngay bây giờ đây sẽ là giải pháp được chấp nhận. Tôi không thể có được -newermt để chạy trên kernel 2.6.18-348.18.1.el5, chứ chưa nói đến kernel mới hơn.
DarkForce

Tương tự ở đây DarkForce, chức năng newermt dường như rất mạnh mẽ
niken

34

Bạn có thể làm điều này:

find ./ -type f -ls |grep '10 Sep'

Thí dụ:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24

Đây là những gì hầu hết mọi người muốn, nhưng nó đã không nhận đủ upvote !!!
sjas

2
điều này có thể không hoạt động khi có một vài triệu tệp trong một thư mục.
Dennis Nolte

3
Có các tác dụng phụ nếu thuật ngữ tìm kiếm grep nằm trong tên tệp.
Snorex

mywiki.wooledge.org/ParsingLs - một cách tiếp cận tốt hơn có lẽ là in ngày tạo ở dạng có thể đọc được bằng máy, có lẽ statnếu bạn không có find -printf.
tripleee

12

Bạn không thể. Công tắc -c cho bạn biết khi quyền được thay đổi lần cuối, -a kiểm tra thời gian truy cập gần đây nhất và -m kiểm tra thời gian sửa đổi. Hệ thống tập tin được sử dụng bởi hầu hết các hương vị của Linux (ext3) không hỗ trợ bản ghi "thời gian tạo". Lấy làm tiếc!


7
Trên thực tế, đó không chỉ là loại hệ thống tệp - không có giao diện hệ thống để lấy thông tin đó, ngay cả khi hệ thống tệp giữ nó. Một trong những thiếu sót của Unix sẽ quay trở lại những ngày đầu tiên, đó là lý do tại sao Unix sẽ không bao giờ cất cánh.
chrisdowney

1
Unix sẽ không bao giờ cất cánh?
lucid_dreamer

8

@Max: đúng về thời gian tạo.

Tuy nhiên, nếu bạn muốn tính những ngày tranh luận trôi qua cho một trong những -atime, -ctime, -mtimethông số, bạn có thể sử dụng các biểu thức sau đây

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Thay thế "2008-09-24" bằng bất cứ ngày nào bạn muốn và ELAPSED_DAYS sẽ được đặt thành số ngày trong khoảng thời gian từ đó đến hôm nay. (Cập nhật: trừ một từ kết quả để căn chỉnh với findlàm tròn ngày.)

Vì vậy, để tìm bất kỳ tệp nào được sửa đổi vào ngày 24 tháng 9 năm 2008, lệnh sẽ là:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Điều này sẽ hoạt động nếu phiên bản findkhông hỗ trợ các -newerXYvị từ được đề cập trong câu trả lời của @Arve :.


2

Với các công tắc -atime, -ctime và -mtime cần tìm, bạn có thể tiến gần đến những gì bạn muốn đạt được.


-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

1
Tại sao bạn sao chép các tập tin? Ngoài lệnh trong `ls ...`công trình, nó không sử dụng findcông cụ.
Yamaneko

-5

Tôi đã tìm thấy tập lệnh này trong một tập lệnh xóa tất cả các tệp cũ hơn 14 ngày:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Tôi nghĩ rằng một chút "người đàn ông tìm thấy" và tìm kiếm các tham số -ctime / -atime, vv sẽ giúp bạn ở đây.

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.