liệt kê tất cả các tệp mới hơn dấu thời gian đã cho và sắp xếp chúng


8

Tôi muốn liệt kê tất cả các tệp (được sắp xếp theo ngày) mới hơn dấu thời gian chỉ ở định dạng 20130207003851trong thư mục / tmp. Các thư mục con có thể được bỏ qua.

Sử dụng SUSE Linux Enterprise Server 11.

Định dạng đầu ra phải là

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

find / tmp -newermt "7 feb 2013" -ls liệt kê các tệp tôi muốn nhưng

  • Làm cách nào tôi có thể sử dụng dấu thời gian trong định dạng 20130207003851
  • Làm thế nào tôi có thể sắp xếp đầu ra?
  • Làm thế nào tôi chỉ có thể hiển thị tên tập tin và ngày. Tên tập tin đầu tiên và sau đó là ngày?

ps Tôi không muốn sử dụng cảm ứng để tạo tập tin tham khảo để tìm

pss

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time

Những gì được 2013007000385cho là đại diện? Tôi đoán năm 2013 là năm, nhưng làm thế nào để bạn có được từ 007000385ngày 7 tháng 2?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Giả sử là 20130207003851. Không sao chép chính xác hoặc ... xin lỗi vì điều đó.
Radek

Câu trả lời:


10

findhỗ trợ rất nhiều định dạng đầu vào ngày . Định dạng đơn giản nhất để có được là YYYYMMDD HH: MM: SS. Bạn đã có các chữ số theo đúng thứ tự, tất cả những gì bạn phải làm là trích xuất nhóm đầu tiên ( ${timestamp%??????}: lấy tất cả trừ 6 ký tự cuối cùng ${timestamp#????????}:: lấy tất cả trừ 8 ký tự đầu tiên) và tiếp tục, thêm dấu câu vào nhóm tiếp theo khi bạn đi cùng

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

Trong bash (và ksh và zsh), nhưng không phải trong tro, bạn có thể sử dụng ${STRING_VARIABLE:OFFSET:LENGTH}cấu trúc dễ đọc hơn .

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

Để sắp xếp các tệp theo ngày, in ra các tên tệp có trước ngày và sắp xếp đó, sau đó loại bỏ tiền tố ngày. Sử dụng -printfđể kiểm soát định dạng đầu ra. in một phần thời gian sửa đổi được xác định bởi ; nếu là , bạn có được số giây kể từ thời kỳ Unix. Dưới đây tôi in ba cột được phân tách bằng tab: thời gian ở định dạng có thể sắp xếp, tên tệp và thời gian ở định dạng có thể đọc được; xóa cột đầu tiên và lệnh gọi để thay thế tab bằng đủ khoảng trắng để chứa tất cả các tên tệp dự kiến ​​(điều chỉnh 40 như mong muốn). Mã này giả định rằng bạn không có dòng mới hoặc tab trong tên tệp.%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40

chỉ phần tìm thấy find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'mang lại cho tôi đầu ra hài hước-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek

@Radek Xin lỗi, đó là %Tcho mtime, %Mlà quyền.
Gilles 'SO- ngừng trở nên xấu xa'

Xinh đẹp. Hoạt động trơn tru. Mã cuối cùng của tôi là find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-tôi tách tên tệp và thời gian bởi -vì tôi sẽ nắm bắt đầu ra trong php và sử dụng - làm dấu phân cách. Cảm ơn bạn rất nhiều.
Radek

@Gilles thật tuyệt vời, nhưng nếu bạn giải thích về việc đánh dấu thời gian, nó sẽ giúp ích nhiều hơn ..
Rahul Patil

@RahulPatil Xong. Tôi cũng đã thêm một phương pháp bash dễ đọc hơn.
Gilles 'SO- ngừng trở thành ác quỷ'

5

Với zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

Các newerhàm trả về đúng cho các tập tin mới hơn $timestamp(lưu ý rằng zsh's zstatkhông hỗ trợ chính xác subsecond dù).

Sau đó, tất cả những gì chúng ta làm là sử dụng zshvòng loại toàn cầu: Dđể bao gồm các tệp chấm, .chỉ xem xét các tệp thông thường, Omsắp xếp theo thời gian sửa đổi và +newergọi newerhàm để xác định tệp nào sẽ chọn.

Nếu bạn cũng muốn hiển thị dấu thời gian của tệp, bạn có thể thay đổi newerthành:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Lưu ý rằng kết quả của việc tạo tên tệp sẽ bao gồm các dấu thời gian có nghĩa là bạn không thể sử dụng chúng làm tên tệp nữa.


điều này sẽ không làm việc hơn ssh, ví dụ.
evandrix
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.