Câu hỏi Làm thế nào để xác minh rằng file2 mới hơn file1 trong bash?


Làm thế nào tôi có thể xác minh rằng file2 được sửa đổi lần cuối sau file1?

Trong ví dụ này, perl đã được sửa đổi gần đây hơn stack. Có lệnh bash hoặc Linux có thể so sánh những tệp này dựa trên thời gian sửa đổi?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl

41
2017-09-13 19:21


gốc




Các câu trả lời:


Tìm thấy rồi  đây

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

42
2017-09-13 19:32



Cũng thế -ot nó cũ hơn". - Dennis Williamson


if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Được lấy từ 'người đàn ông kiểm tra'. Trích:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2

30
2017-09-13 20:03





Một cách khác để làm điều này:

find -name file2 -newer file1

sẽ trả về null nếu file2 lớn hơn hoặc bằng tuổi với file1. Nó sẽ trả về tên (và thư mục) của file2 nếu nó mới hơn.

Lưu ý rằng Linux không theo dõi được thời điểm các tệp được tạo. Các thử nghiệm này sẽ là ngày và giờ sửa đổi gần đây nhất.


7
2017-09-13 19:45



Linux không theo dõi thời gian tạo: Nó được gọi là ctime. Nó cũng theo dõi thời gian truy cập cuối cùng: atime. Nó chỉ sử dụng mtime nói chung vì đây là lần sửa đổi cuối cùng, hữu ích nhất. - Coroos
@Coroos: ctime không phải là thời gian sáng tạo. Đây là thời gian thay đổi inode và được cập nhật khi các thuộc tính của tệp chẳng hạn như chủ sở hữu hoặc quyền hoặc thay đổi hoặc khi bạn sửa đổi tệp. Một số hệ thống tập tin hỗ trợ thời gian sinh, nhưng hạt nhân thì không. Stat cho thấy thời gian sinh trống. Xem unix.stackexchange.com/a/91200 Lưu ý rằng OS X hỗ trợ thời gian sinh stat -f %SB filename - Dennis Williamson
Xem thêm htrp: //unix.stackexchange.com/a/50184 về cách sử dụng debugfs để xem thời gian tạo (sinh) trong Linux. - Dennis Williamson


echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Nếu kết quả là> 0, tệp đầu tiên mới hơn. (Mới hơn về sửa đổi cuối cùng-, không phải thời gian tạo, được lưu trữ trên linux).


2
2018-01-13 07:55



-nt nói chung là tốt hơn, nhưng đây vẫn là một bài viết hữu ích ... - BuvinJ


Nếu bạn muốn biết thêm thông tin chi tiết, bạn có thể sử dụng stat chỉ huy

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400

1
2017-09-14 07:18





Theo liên kết này, unix không lưu trữ ngày tạo. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Nhưng lưu trữ quyền truy cập cuối cùng.

để truy cập lần cuối

 ls -t  # displays in order of date. So the first one is the 

ls hiển thị từng tập tin trên một dòng mới.

Vì vậy, ls -t hiển thị tệp mới nhất trên dòng đầu tiên, v.v.

  • Bạn có thể sử dụng chính mình để chọn dòng đầu tiên.
  • Bạn có thể sử dụng sed để chọn dòng đầu tiên.

    ls -t php.exe php.ini | sed -n '1p' php.ini

Có thể làm -lt  mặc dù bạn sẽ thấy rằng nếu bạn không chỉ định bất kỳ tệp nào .. và nó thực hiện thư mục .. thì nó cung cấp tổng số trên dòng đầu tiên, vì vậy bạn chọn dòng thứ hai như $ls -lt | sed -n '2p'

Một người tốt sẽ là

ls -t | head -n 1

hoặc là

ls -lt | head   

hiển thị 10 dòng đầu tiên trong tập tin đầu tiên được sửa đổi đầu tiên và bạn có thể thấy nó là gì


0
2017-09-13 19:51



-t là thời gian sửa đổi; -u là thời gian truy cập - Dennis Williamson
cảm ơn .. Tôi đã tự hỏi về -u .. sự phân biệt .. và có như bạn đề nghị .. -t và -u theo thời gian .. như người đàn ông có nó. tốt hơn là nói nó đặt hàng theo ngày. - barlop
mặc dù có lẽ không tốt như đã nói theo thứ tự theo ngày / giờ ;-) - barlop


Đây là một kịch bản nhỏ, tôi đã làm:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

0
2017-07-03 17:05



Bạn nên giải thích chi tiết hơn những gì đang làm với một số tham chiếu cho lệnh để những người có khả năng sử dụng nó có cơ hội để đọc về nó hoặc nghe bạn chia nhỏ hơn một chút so với chỉ chứng minh các lệnh và cú pháp. - Pimp Juice IT