2011-01-14 17 views
9

Tôi có một tập lệnh Bash liên tục sao chép các tệp mỗi 5 giây. Nhưng đây là một liên lạc quá mức cần thiết như thường không có thay đổi.Tập lệnh Bash - xác định xem tệp có được sửa đổi không?

Tôi biết về lệnh Linux watch nhưng vì tập lệnh này sẽ được sử dụng trên máy tính OS X (không có watch và tôi không muốn mọi người cài đặt macports) tôi cần kiểm tra xem một tập tin được sửa đổi hay không với mã Bash thẳng.

Tôi có nên kiểm tra thời gian sửa đổi tệp không? Làm thế nào tôi có thể làm điều đó?

Chỉnh sửa: Tôi đã hy vọng mở rộng tập lệnh của mình để làm nhiều hơn là chỉ sao chép tệp, nếu phát hiện thấy thay đổi. Vì vậy, có một cách bash tinh khiết để làm điều này?

+0

lẽ bạn có thể sử dụng 'rsync' để thay thế? Nó có thể so sánh dấu thời gian và kích thước với dấu thời gian và kích thước của tệp đích và tránh sao chép nếu chúng giống nhau. (Nếu bạn đang sao chép vào một hộp điều khiển từ xa, vẫn sẽ có phí kết nối.) – Thomas

Trả lời

13

tôi có xu hướng đồng ý với câu trả lời rsync nếu bạn có cây lớn các tập tin để quản lý, nhưng bạn có thể sử dụng -u (--update) cờ để cp để sao chép các tập tin (s) so với chỉ khi nguồn mới hơn đích.

cp -u

Sửa

Vì bạn đã cập nhật các câu hỏi để cho biết rằng bạn muốn lấy một số hành động bổ sung, bạn sẽ muốn sử dụng các -nt séc trong các [ (test) lệnh dựng sẵn:

#!/bin/bash 

if [ $1 -nt $2 ]; then 
    echo "File 1 is newer than file 2" 
else 
    echo "File 1 is older than file 2" 
fi 

Từ trang người đàn ông:

file1 -nt file2 
     True if file1 is newer (according to modification date) than 
     file2, or if file1 exists and file2 does not. 

Hy vọng điều đó sẽ hữu ích.

0

Không. Bạn nên sử dụng rsync hoặc một trong các giao diện người dùng để sao chép tệp, vì nó sẽ phát hiện xem các tệp có khác và chỉ sao chép chúng nếu chúng có.

+5

'rsync' là một gợi ý hữu ích (mặc dù bạn có thể thấy trong bản chỉnh sửa của tôi, không hoàn toàn là những gì tôi cần). Nhưng tôi tìm thấy giọng của bạn một chút off-đặt. –

+1

@Alan H: Có thể tôi đang thiếu điều gì đó nhưng tôi không tìm thấy giọng nói nào hết. Trong thực tế, tôi đã ngạc nhiên bởi phản ứng của bạn. –

3

Bạn có thể thấy nó đáng tin cậy hơn để phát hiện các thay đổi trong nội dung tệp bằng cách so sánh kích thước tệp (nếu kích thước khác nhau, nội dung) và hàm băm của nội dung. Nó có lẽ không quan trọng mà băm bạn sử dụng cho mục đích này: SHA1 hoặc thậm chí MD5 có lẽ là đủ, và bạn có thể thấy rằng lệnh cksum là đủ.

Thời gian sửa đổi tệp có thể thay đổi mà không thay đổi nội dung (suy nghĩ touch file); thời gian sửa đổi tệp không thể thay đổi ngay cả khi nội dung thực hiện (thực hiện việc này khó hơn, nhưng bạn có thể sử dụng touch -r ref-file file để đặt thời gian sửa đổi file để khớp với ref-file sau khi chỉnh sửa tệp).

+0

Tại sao lại sử dụng hàm băm thay vì so sánh bit-cho-bit? Không phải là bit-for-bit so sánh sẽ được nhanh hơn chạy qua toàn bộ tập tin và tạo thành một băm của nó? – Pacerier

+1

@Pacerier: Nếu các tệp khác nhau, thì so sánh từng byte có thể nhanh hơn trừ khi byte cuối cùng là byte duy nhất khác. Nếu các tệp giống nhau, bạn chỉ có thể hiển thị điều đó bằng cách so sánh tất cả các byte. Lợi thế của một băm là bạn có thể lưu trữ giá trị cũ của băm (tương đối nhỏ) và so sánh nó với giá trị mới của băm được tái tạo từ tệp hiện tại. Nếu có sự khác biệt, thì tệp đã thay đổi. Việc so sánh từng byte đòi hỏi phải có tệp cũ. –

6

OS X có lệnh stat. Một cái gì đó như thế này sẽ cho bạn thời gian sửa đổi của một tập tin:

stat -f '%m' filename 

Các GNU tương đương sẽ là:

stat --printf '%Y\n' filename 
Các vấn đề liên quan