Tìm tập tin mới nhất


10

Làm cách nào để tìm ra tệp được truy cập gần đây nhất trong một thư mục nhất định?

Tôi có thể sử dụng findlệnh để liệt kê tất cả các tệp được sửa đổi / truy cập trong những nphút cuối . Nhưng ở đây trong trường hợp của tôi, tôi không chắc chắn khi tập tin cuối cùng được sửa đổi / truy cập? Tất cả những gì tôi cần là liệt kê tất cả các tệp được truy cập / sửa đổi gần đây trong số tất cả các tệp phụ hoặc thư mục con khác, được sắp xếp theo thời gian truy cập / sửa đổi của chúng, ví dụ.

Điều đó có thể không?


Câu hỏi của bạn không rõ ràng. Bạn đang nói rằng bạn muốn lấy danh sách các tập tin từ tìm và sắp xếp chúng theo ngày?
RobertL

3
Ồ, tôi hiểu rồi. Tôi nghĩ. Bạn muốn sắp xếp toàn bộ tập tin "gần đây" theo thời gian truy cập / sửa đổi của chúng, bất kể vị trí của chúng trong cây tệp là gì?
roaima

Câu trả lời:


4

Bạn có thể sử dụng công tắc đệ quy ( -R) để lscùng với công tắc sắp xếp theo thời gian ( -t) và công tắc sắp xếp ngược ( -r) để liệt kê tất cả các tệp trong cây thư mục. Điều này sẽ không sắp xếp tất cả các tệp theo ngày truy cập / sửa đổi của chúng trên các thư mục con, nhưng sẽ sắp xếp chúng theo ngày này trong mỗi thư mục con một cách độc lập.

Sử dụng một lệnh như thế này : ls -ltrR <sometopdir>.

Thí dụ

$ ls -ltrR .
total 759720
-rw-r-----@  1 sammingolelli  staff    2514441 Mar 31  2015 restfulapi-120704053212-phpapp01.pdf
-rw-r-----@  1 sammingolelli  staff     567808 Apr  7  2015 USGCB-Windows-Settings.xls
-rw-r-----@  1 sammingolelli  staff     180736 Apr  7  2015 USGCB-RHEL5-Desktop-Settings-Version-1.2.5.0.xls
-rw-r-----@  1 sammingolelli  staff       6474 Apr  8  2015 tap_kp_mavericks.txt

./kerberos:
total 5464
-rw-r-----@ 1 sammingolelli  staff    37317 Oct  2 13:03 Set_up_Kerberos_instruction_d8.docx
-rw-r-----@ 1 sammingolelli  staff  2753195 Oct 13 13:49 Keberos configuration with AD 01_09_2014.pdf

./homestarrunner:
total 10624
-rw-rw-rw-@ 1 sammingolelli  staff   319422 May 10  2000 error_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    53499 Jun  8  2001 sb_duck.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   199254 Mar 11  2002 email_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff    39288 Mar 25  2002 bubs_dontutalk.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    75432 May  6  2002 trash_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298946 Dec  1  2002 error_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298686 Dec  1  2002 startup_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    90279 Dec  1  2002 sb_meedlymee.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    73561 Dec  1  2002 sb_dubdeuce.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   193097 Dec  1  2002 sb_pizza.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    30093 Dec  1  2002 sb_stiny.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61858 Dec  1  2002 ss_sadflying.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   150142 Dec  1  2002 email_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    68545 Dec  1  2002 bubs_grabbinbutt.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61022 Dec  1  2002 cz_jeorghb.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    40124 Dec  1  2002 marzy_nasty.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   224116 Dec  1  2002 shutdown_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   260546 Dec  1  2002 shutdown_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    57686 Dec  1  2002 trash_hs.wav

13

Để in 3 tệp được truy cập gần nhất (được sắp xếp từ tệp được truy cập cuối cùng sang tệp được truy cập cuối cùng thứ ba):

find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'

Để in 3 tệp sửa đổi cuối cùng (được sắp xếp từ tệp sửa đổi cuối cùng sang tệp sửa đổi cuối cùng thứ ba):

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'
  • find . -type f -exec stat -c '%X %n' *: in thời gian truy cập cuối cùng theo sau là đường dẫn của tệp cho mỗi tệp trong phân cấp thư mục hiện tại;
  • find . -type f -exec stat -c '%Y %n' *: in thời gian sửa đổi lần cuối theo sau là đường dẫn của tệp cho mỗi tệp trong phân cấp thư mục hiện tại;
  • sort -nr: sắp xếp theo thứ tự số nghịch đảo;
  • awk 'NR==1,NR==3 {print $2}': in trường thứ hai của dòng thứ nhất, thứ hai và thứ ba.

Bạn có thể thay đổi số lượng tệp sẽ được hiển thị bằng cách thay đổi 3 thành số lượng tệp mong muốn awk 'NR==1,NR==3 {print $2}'.

% touch file1
% touch file2
% touch file3
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% cat file1
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file1
./file3
./file2
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% touch file2
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file2
./file1
./file3
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file2
./file3
./file1

Bộ chỉ huy không tôn vinhyear
SHW

@SHW Không chắc ý bạn là gì. Các tệp được sắp xếp dựa trên số giây được truyền từ ngày 1 tháng 1 năm 1970.
kos

Hoạt động trên Mac OS X nhưng với một chút tinh chỉnh theo lệnh stat:stat -f '%Dm %N'
Matt Kneiser

Để giúp những người dùng khác: nếu bạn muốn quét một thư mục khác ngoài thư mục hiện tại, hãy thay thế .trực tiếp sau find. Phải mất vài phút để hiểu nó.
Marc Vanhoomissen

Các lệnh này phá vỡ các tên tệp có chứa khoảng trắng. Thủ phạm là awkvà vì tôi không biết cách sử dụng nó, chỉ cần thay thế awklệnh bằng | head -n 3(để giữ ba kết quả đầu tiên) thực hiện thủ thuật. Nếu bạn vẫn muốn xóa dấu thời gian, hãy xâu chuỗi nó với| cut -d' ' -f2-
Maëlan

4

Lệnh này cũng cung cấp tệp hoặc thư mục được sửa đổi gần đây nhất từ ​​cây thư mục hiện tại:

% find . -printf '%TY-%Tm-%TdT%TT %p\n' |sort |tail -1
2019-01-30T17:29:18.0330479800 ./servlet-api/META-INF/NOTICE

Tất nhiên, bạn có thể thay đổi đối số cuối cùng thành số lượng tệp gần đây nhất mà bạn có thể cần.


3

Nếu bạn muốn các tệp trong một thư mục nhất định được sắp xếp theo tuổi sửa đổi (lần đầu tiên gần đây nhất):

ls -t

Để sắp xếp theo thời gian truy cập, thêm -utùy chọn.

ls -tu

Tuy nhiên, hãy cẩn thận rằng các hệ thống Linux hiện đại không theo dõi thời gian truy cập chính xác theo mặc định . Vì vậy, dấu thời gian truy cập có thể không đáng tin cậy.

Nếu bạn muốn tìm tệp gần đây nhất trong cây thư mục, bao gồm các thư mục con, phương pháp đơn giản nhất cho đến nay là sử dụng vòng loại toàn cầu của zsh .

print -lr -- **/*(om)

Sử dụng oathay vì omsử dụng thời gian truy cập thay vì thời gian sửa đổi. Bạn có thể hạn chế các trận đấu, ví dụ để có được 10 tệp gần đây nhất:

print -lr -- **/*(om[1,10])

1

Bạn muốn sắp xếp toàn bộ tập tin "gần đây" theo thời gian truy cập / sửa đổi của chúng, bất kể vị trí của chúng trong cây tệp?

Một cách để làm điều này là sử dụng statđể in thời gian sửa đổi cho mỗi tệp, sorttheo kết quả và sau đó cutlà thời gian sửa đổi từ kết quả.

Điều này sẽ phá vỡ các tệp chứa dòng mới trong tên của chúng, nhưng đối với các tệp khác, đây là một giải pháp sẽ liệt kê các tệp được sửa đổi trong vòng 60 phút qua, được sắp xếp từ gần đây nhất đến sửa đổi gần đây nhất:

find . -type f -mmin -60 -exec stat -c $'%Y\t%n' {} + | sort -nr | cut -f2-

0

Chúng ta hãy đặt điều này vào một hàm bash đa nền tảng:

# Print N most recently modified files in current dir or below
mrf() {
    local _n=${1:-3} # Default to 3
    case $OSTYPE in
        linux*|msys*)
            find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
        ;;
        darwin*)
            find . -type f -exec stat -f '%Dm %N' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $2}' | while read f; do stat -f '%Sm -- %N' $f; done
        ;;
     esac
 }

Sử dụng:

$ mrf
Jan 10 11:50:03 2019 -- ./somefile
Jan 10 11:44:24 2019 -- ./nested/dir/file.txt
Jan 10 11:40:50 2019 -- ./anotherfile

$ mrf 5
Jan 10 11:50:03 2019 -- ./somefile
Jan 10 11:44:24 2019 -- ./nested/dir/file.txt
Jan 10 11:40:50 2019 -- ./anotherfile
Jan 10 06:30:22 2019 -- ./otherdir/yetanotherfile
Jan 09 10:00:00 2019 -- ./oldfile

0

Tôi đã sử dụng kịch bản "mrt" được đề cập từ Matt Kneiser cho một số cuộc điều tra. Sau đó, một số tệp được hiển thị như đã thay đổi 2018-12-11. Trong các cuộc điều tra sâu hơn tôi phát hiện ra rằng ngày đã nêu không phải là ngày sửa đổi mà là ngày truy cập. Về stathướng dẫn, chuỗi định dạng chính xác trên linux không phải là% X mà là% Y cho ngày sửa đổi cuối cùng thay vì ngày truy cập cuối cùng. Ở đây các mục nhập thủ công vào năm 2020-03-17 trên debian:

%X     time of last access, seconds since Epoch
%Y     time of last data modification, seconds since Epoch

Theo tôi, câu lệnh linux đúng trên tập lệnh của bạn sẽ giống như:

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done

Chào mừng đến với trang web và cảm ơn bạn đã đóng góp. Địa chỉ mở của bạn được hướng vào người đóng góp của một câu trả lời khác nhau; điều này có thể gây nhầm lẫn cho độc giả vì câu trả lời sẽ được hiển thị theo bất kỳ loại sắp xếp nào tùy thuộc vào hoạt động, số phiếu và cài đặt người dùng cá nhân. Vui lòng điều chỉnh lại câu trả lời để làm cho nó "khép kín" nhất có thể cho đến khi bạn có danh tiếng cần thiết để bình luận ở mọi nơi. Bạn vẫn có thể tham khảo nó bằng cách bao gồm một liên kết, xem nút "chia sẻ" bên dưới câu trả lời khác (giả sử tôi đã tìm đúng;)).
AdminBee

1
@AdminBee cảm ơn bạn đã đề xuất. Tôi đã thêm một liên kết đến câu trả lời gốc mà tôi đã cố gắng cải thiện. Hi vọng điêu nay co ich.
Phần mềm OASE GmbH
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.