In ngày sửa đổi cuối cùng của tệp trong Bash


147

Tôi dường như không thể tìm thấy làm thế nào để in ngày của một tập tin. Cho đến nay tôi có thể in ra tất cả các tệp trong một thư mục, nhưng tôi cần in ra ngày với nó.

Tôi biết tôi cần phải đính kèm một định dạng ngày với tiếng vang của mục, nhưng tất cả tôi không thể tìm thấy định dạng chính xác.

echo "Please type in the directory you want all the files to be listed"

read directory 

for entry in "$directory"/*
do
  echo "$entry"
done

2
đọc -p "Vui lòng nhập vào thư mục bạn muốn tất cả các tệp được liệt kê"
CousinCocaine

Câu trả lời:


146

Bạn có thể sử dụng stat lệnh

stat -c %y "$entry"

Thêm thông tin

% y thời gian sửa đổi lần cuối, có thể đọc được

for entry in "$directory"/* do stat -c%y "$entry" done Không hoạt động. In ra stat: toán hạng bị thiếu trong thiết bị đầu cuối
Hokerie

Hừm, có thể là unbfox của tôi không? Bạn có biết những yêu cầu của việc sử dụng statlà gì?
Hokerie

33
Lưu ý rằng trên OS X (Mac), nó stat -f "%m%t%Sm %N" filename(xem man stat ví dụ để biết thêm chi tiết)
Olie

3
Lưu ý rằng trên BSD, statlệnh có một cú pháp khác. Trường hợp của tôi cho FreeBSD : stat -f %Sm -t %F" "%R filename.
Sopalajo de Arrierez

228

Không phải lệnh 'ngày' đơn giản hơn nhiều sao? Không cần awk, stat, v.v.

date -r <filename>

Ngoài ra, hãy xem xét việc xem trang người đàn ông để định dạng ngày; ví dụ với định dạng ngày giờ phổ biến:

date -r <filename> "+%m-%d-%Y %H:%M:%S"

11
Đơn giản hơn nhiều sau đó sử dụng stat / có sẵn hơn.
Ing

11
Có vẻ như BSD (hoặc ít nhất là của OS X) datekhông có điều này. Nó -rchỉ được sử dụng để cung cấp dấu thời gian để định dạng. Bạn sẽ phải sử dụng ngày GNU để có được chức năng này.
Waleed Khan

4
Trên OSX sử dụng: ngàystat -f "%Sm" -t "%m%d%H%M%y" "${1}"
Michaelangel007

3
Trên OS X 10.10 ngày -r <tên tệp> hoạt động như quảng cáo, mặc dù trang man không mô tả bất kỳ đối số <tên tệp> nào.
gotofritz

3
Trong macOS 10.13 date [-r seconds | filename]được ghi lại đầy đủ trong mantrang và hoạt động như mong đợi.
vang

14

Trên OS X, tôi thích ngày của tôi ở định dạng YYYY-MM-DD HH:MMtrong đầu ra cho tệp.

Vì vậy, để chỉ định một tập tin tôi sẽ sử dụng:

stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename]

Nếu tôi muốn chạy nó trên một loạt các tệp, tôi có thể làm một cái gì đó như thế này:

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
done

Ví dụ này sẽ in ra lần cuối cùng tôi chạy sudo periodic daily weekly monthlylệnh khi nó tham chiếu các tệp nhật ký.


Để thêm tên tệp theo mỗi ngày, tôi sẽ chạy như sau:

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
  echo "$i"
done

Đầu ra sẽ như sau:

2016-40-01 16:40
/var/log/daily.out
2016-40-01 16:40
/var/log/monthly.out
2016-40-01 16:40
/var/log/weekly.out

Thật không may, tôi không chắc chắn làm thế nào để ngăn chặn ngắt dòng và giữ cho tên tệp được thêm vào cuối ngày mà không cần thêm dòng vào tập lệnh.


Tái bút - Tôi sử dụng #!/usr/bin/env bashvới tư cách là người dùng Python theo ngày và có các phiên bản bashcài đặt khác nhau trên hệ thống của tôi thay vì#!/bin/bash


Trong trường hợp bạn chưa tìm ra phần ngắt dòng, cờ -e có sẵn cho chương trình echo. Ví dụ sử dụng có thể là : echo -e "$(stat -f %Sm -t %Y%m%d_%H%M%S $AFile)\t$AFile.". Trong trường hợp của bạn, nó có thể là: echo -e "$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")\t$i." `
Thoth


6

Thêm vào câu trả lời @StevePenny, bạn có thể muốn cắt phần không dễ đọc của con người:

stat -c%y Localizable.strings | cut -d'.' -f1

3

Tôi muốn có được một ngày sửa đổi của tập tin ở YYYYMMDDHHMMSSđịnh dạng. Đây là cách tôi đã làm nó:

date -d @$( stat -c %Y myfile.css ) +%Y%m%d%H%M%S

Giải trình. Đó là sự kết hợp của các lệnh này:

stat -c %Y myfile.css # Get the modification date as a timestamp
date -d @1503989421 +%Y%m%d%H%M%S # Convert the date (from timestamp)

2

EDITED: hóa ra tôi đã quên các trích dẫn cần thiết $entryđể in chính xác và không đưa ra lỗi "không có tệp hoặc thư mục như vậy". Cảm ơn tất cả các bạn rất nhiều vì đã giúp tôi!

Đây là mã cuối cùng của tôi:

    echo "Please type in the directory you want all the files to be listed with last modified dates" #bash can't find file creation dates

read directory

for entry in "$directory"/*

do
modDate=$(stat -c %y "$entry") #%y = last modified. Qoutes are needed otherwise spaces in file name with give error of "no such file"
modDate=${modDate%% *} #%% takes off everything off the string after the date to make it look pretty
echo $entry:$modDate

In ra như thế này:

/home/joanne/Dropbox/cheat sheet.docx:2012-03-14
/home/joanne/Dropbox/Comp:2013-05-05
/home/joanne/Dropbox/Comp 150 java.zip:2013-02-11
/home/joanne/Dropbox/Comp 151 Java 2.zip:2013-02-11
/home/joanne/Dropbox/Comp 162 Assembly Language.zip:2013-02-11
/home/joanne/Dropbox/Comp 262 Comp Architecture.zip:2012-12-12
/home/joanne/Dropbox/Comp 345 Image Processing.zip:2013-02-11
/home/joanne/Dropbox/Comp 362 Operating Systems:2013-05-05
/home/joanne/Dropbox/Comp 447 Societal Issues.zip:2013-02-11

2

Đối với các ngắt dòng tôi đã chỉnh sửa mã của bạn để có được một cái gì đó không có ngắt dòng.

#!/bin/bash
for i in /Users/anthonykiggundu/Sites/rku-it/*; do
   t=$(stat -f "%Sm"  -t "%Y-%m-%d %H:%M" "$i")
   echo $t : "${i##*/}"  # t only contains date last modified, then only filename 'grokked'- else $i alone is abs. path           
done

1

Nếu tên tệp không có khoảng trắng:

ls -l <dir> | awk '{print $6, " ", $7, " ", $8, " ", $9 }'

Bản in này có định dạng như sau:

 Dec   21   20:03   a1.out
 Dec   21   20:04   a.cpp

Nếu tên tệp có khoảng trắng (bạn có thể sử dụng lệnh sau cho tên tệp không có khoảng trắng, chỉ có vẻ phức tạp / xấu hơn so với trước đây):

 ls -l <dir> | awk '{printf ("%s %s %s ",  $6,  $7, $8); for (i=9;   i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'

Ah tôi thấy! Điều đó chủ yếu hoạt động, ngoại trừ các tệp có khoảng trắng trong tên. Có một giải pháp cho điều đó?
Hokerie

Trên thực tế, tôi đã thử lại và nó không hoạt động ... hóa ra tôi đang thử một thư mục có tên tệp không có dấu cách. = / Đã chỉnh sửa câu trả lời của tôi bên dưới
Hokerie

Khi bạn nói nó không hoạt động, bạn có thể nói lỗi là gì không? nó hoạt động với tôi khi tôi thực thi nó trên hệ thống của mình.
Hóa đơn

Tôi nhận được một "không có tập tin hoặc thư mục như vậy".
Hokerie

Đó là bởi vì bạn đã thông qua một giá trị <dir>không tồn tại .... mã hoàn toàn tốt.
Hóa đơn

0

Bạn có thể dùng:

ls -lrt filename |awk '{print "%02d",$7}'

Điều này sẽ hiển thị ngày trong 2 chữ số.

Nếu từ 1 đến 9, nó thêm tiền tố "0" vào nó và chuyển đổi thành 01 - 09.

Hy vọng điều này đáp ứng sự mong đợi.

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.