Làm thế nào để hiển thị ngày giờ đã sửa đổi với lệnh 'find'?


85

Với một findlệnh, tôi có thể hiển thị tên thư mục với nhiều cấp độ. Lệnh sau hiển thị tất cả các thư mục trong /varđường dẫn với độ sâu là 2:

find /var -maxdepth 2 -type d;

Kết quả cho thấy:

/var
/var/log
/var/log/sssd
/var/log/samba
/var/log/audit
/var/log/ConsoleKit
/var/log/gdm
/var/log/sa

Với một statlệnh, tôi có thể tìm thấy ngày giờ đã sửa đổi:

stat /var/log/samba | grep 'Modify:'

Kết quả là:

Modify: 2014-01-02 11:21:27.762346214 -0800 

Có cách nào để kết hợp hai lệnh để các thư mục sẽ được liệt kê với ngày giờ đã sửa đổi không?

Câu trả lời:


63

Bạn có thể sử dụng công -exectắc cho findvà xác định định dạng đầu ra của statviệc sử dụng công -ctắc như sau:

find /var -maxdepth 2 -type d -exec stat -c "%n %y" {} \;

Điều này sẽ cung cấp cho tên tệp theo sau là thời gian sửa đổi của nó trên cùng một dòng của đầu ra.


nó tốt hơn câu trả lời của tôi, +1
Kent

Các -printftùy chọn bên dưới tránh gọi statcho tất cả các tập tin được tìm thấy. Trong thử nghiệm của tôi, lệnh cho kết quả gần như giống hệt nhau, chỉ cần thêm một chữ số trên giây.
mwfearnley

Đối với MacOS, ký tự đối số định dạng cho stat-f. find /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \;
toddcscar

124

Câu trả lời được chấp nhận hoạt động nhưng nó chậm. Không cần phải thực thi thống kê cho từng thư mục, tìm cung cấp ngày sửa đổi và bạn có thể in trực tiếp ra. Đây là một lệnh tương đương nhanh hơn đáng kể:

 find /var -maxdepth 2 -type d -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"

4
Một giải pháp tốt hơn nhiều. Nó cũng hoạt động với findmsys từ chạy trên Windows, vốn thiếu statlệnh.
Snorfalorpagus

7
Trên mac, 'brew install findutils' và sau đó gfind có tùy chọn -printf.
WeakPointer

%Tcin "ngày và giờ của ngôn ngữ", cho phép chuỗi định dạng "% p% Tc"
Andreas

Các liên kết hữu ích hơn để giải thích về% formatters. unix.stackexchange.com/a/215236/216480 hoặc trên trang người dùng tìm kiếm "định dạng -printf"
styks

1
Mặc dù chuỗi định dạng "% p% Tc" hoạt động, nó định dạng đầu ra hơi khác một chút. Ví dụ: "/ var / spool Thứ Hai ngày 29 tháng 9 năm 2014 09:05:54 BST" thay vì "/ var / spool 2014-09-29 09: 05: 54.000000000 +0100".
kzar

15

find /var -maxdepth 2 -type d | xargs ls -oAHd

Đây là một cách để lấy lslệnh cơ bản của bạn để hiển thị đường dẫn thư mục đầy đủ. Trong khi lscó những -Rthông số cho tìm kiếm đệ quy, đường dẫn sẽ không được hiển thị trong các kết quả với -lhay -otùy chọn (trong OSX, ít nhất), cho ex với: ls -lR.


Vui lòng thêm giải thích tại sao điều này trả lời câu hỏi. Nói chung, bất kỳ khi nào bạn đăng mã ví dụ trong câu trả lời trên StackOverflow, văn hóa là luôn đưa ra lời giải thích cho nó. Nếu không, rủi ro khi người kiểm duyệt xóa câu trả lời của bạn là câu trả lời chất lượng thấp do độ dài ngắn và thiếu giải thích.
sidehowbarker

3
Điều này bạn có thể đạt được find /var -maxdepth 2 -type d -lsđơn giản hơn.
Grzegorz Krauze

13

Các phiên bản GNU gần đây của findcũng bao gồm một -printftùy chọn bao gồm các trường ngày. Nếu bạn cần in tên tệp và thời gian sửa đổi ở định dạng "C" tiêu chuẩn, bạn có thể sử dụng -printf "%c %p\n".

Nếu bạn muốn ngày ở một định dạng cụ thể, bạn có thể sử dụng %Cký tự trường theo sau. Ví dụ, 4 chữ số năm sẽ là %CY, với Yviệc nhân vật cho năm 4 chữ số.
Lưu ý rằng nếu bạn cần nhiều trường, bạn sẽ cần chỉ định %Cnhiều lần. Ví dụ: định dạng YYYY-MM-DD sẽ như thế nào %CY-%Cm-%Cd.

Kiểm tra các trang người đàn ông hoặc tài liệu trực tuyến để biết thêm chi tiết.

Đây là một ví dụ hoạt động:

find . -name favicon.ico -printf "%c %p\n"

8

Một cái khác mà tôi sử dụng để in các tệp đã sửa đổi vào ngày hôm trước. ls -ltr cung cấp cho tôi chi tiết hơn như thời gian sửa đổi, người dùng, v.v.

find <my_dir> -mtime -1 -type f -print | xargs ls -ltr 

1
Đây là cách gõ đơn giản nhất, dễ nhớ nhất và nhanh chóng nhất. (Tôi sử dụng nó mà không có args -mtime và -type, thay vào đó sử dụng một -name '*.ext'thông số kỹ thuật. ls -ltSắp xếp theo thời gian sửa đổi.)
Brent Faust

1
Điều này không hoạt động khi tên tệp chứa khoảng trắng. Tốt hơn là sử dụng -print0thay vì -printvà sau đó sử dụng xargs -0thay thế xargs.
emk2203

1

hãy thử dòng này:

find /var -maxdepth 2 -type d|xargs stat|grep -E 'File|Modi'

ở đây tôi đã chạy nó, nó xuất ra:

....
  File: ‘/var/cache/cups’
Modify: 2013-12-24 00:42:59.808906421 +0100
  File: ‘/var/log’
Modify: 2014-01-01 12:41:50.622172106 +0100
  File: ‘/var/log/old’
Modify: 2013-05-31 20:40:23.000000000 +0200
  File: ‘/var/log/journal’
Modify: 2013-12-15 18:56:58.319351603 +0100
  File: ‘/var/log/speech-dispatcher’
Modify: 2013-10-27 01:00:08.000000000 +0200
  File: ‘/var/log/cups’
Modify: 2013-12-22 00:49:52.888346088 +0100
  File: ‘/var/opt’
Modify: 2013-05-31 20:40:23.000000000 +0200
....
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.