Làm cách nào để xác minh rằng file2 mới hơn file1 trong bash?


51

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ó một lệnh bash hoặc Linux nào có thể so sánh các tệp này dựa trên thời gian sửa đổi không?

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

Câu trả lời:


51

Tìm thấy nó ở đây

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

14
Cũng -otlà "già hơn".
Dennis Williamson

1
Tôi nghĩ rằng tôi vừa gặp vấn đề với điều này. Đối với các tệp có cùng thời gian sửa đổi xuống đến giây, chúng có cùng độ tuổi "bằng" với các thử nghiệm này; cả -nt và -ot đều cho cùng một kết quả (sai). Trong trường hợp sử dụng của tôi, tôi đã có một chương trình đọc kết quả đầu ra khác và tôi cần đảm bảo rằng chúng đã chạy đúng thứ tự. Trong trường hợp này có vẻ cần phải so sánh nano giây.
sjmc


7

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

find -name file2 -newer file1

sẽ trả về null nếu file2 cũ hơn hoặc cù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.

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


2
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

2
@Coroos: ctimekhông phải là thời gian sáng tạo. Đó là thời gian thay đổi inode và được cập nhật khi các thuộc tính của tệp 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 kernel thì không. Stat cho thấy một thời gian sinh trống. Xem unix.stackexchange.com/a/91200 Lưu ý rằng OS X hỗ trợ thời gian sinhstat -f %SB filename
Dennis Williamson

Đồng thời xem htrp: //unix.stackexchange.com/a/50184 về cách sử dụng debugfsđể xem thời gian tạo (sinh) trong Linux.
Dennis Williamson

2

Nếu bạn muốn biết thêm thông tin chi tiết, bạn có thể sử dụng statlệnh

<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

2
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ề mặt sửa đổi lần cuối-, không phải thời gian tạo, được lưu trữ trên linux).


-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

0

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 không lưu trữ 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ị mỗi tập tin trên một dòng mới.

vì vậy ls -t hiển thị tập tin 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ó sẽ đưa ra 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 cá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 để tập tin đầu tiên được sửa đổi đầu tiên và bạn có thể thấy đó là tập tin nào


-tlà thời gian sửa đổi; -ulà thời gian truy cập
Dennis Williamson

cảm ơn .. tôi đã tự hỏi về -u .. sự khác biệt .. và vâng như bạn đề nghị .. -t và -u được sắp xếp theo thời gian .. như con người 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ự ngày / giờ ;-)
barlop

0

Đâ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 "

Bạn nên giải thích chi tiết hơn những gì nó đ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 phá vỡ nó nhiều hơn một chút so với việc chỉ chứng minh các lệnh và cú pháp.
Pimp Juice IT
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.