2011-01-14 13 views
9

5秒ごとにファイルを繰り返しコピーするBashスクリプトがあります。しかし、これは通常、変化がないので、タッチオーバーキルです。Bashスクリプト - ファイルが変更されているかどうかを確認しますか?

私は、Linuxのコマンドwatchについて知っているが、このスクリプトは(watchを持っていない、と私は誰もがMacPortsをインストールしたくない)OS Xコンピュータで使用されるように私がいるかどうかを確認できるようにする必要がありますファイルはまっすぐなBashコードで修正されます。

ファイルの変更時刻を確認する必要がありますか?どうやってやるの?

編集:変更を検出した場合、ファイルをコピーする以外にもスクリプトを拡張したいと考えていました。だからこれを行うための純粋なbashの方法はありますか?

+0

たぶんあなたの代わりに 'rsync'を使用することができますか?タイムスタンプとサイズをタイムスタンプとターゲットファイルのサイズと比較し、同じであればコピーを避けることができます。 (もしあなたがリモートボックスにコピーしているのであれば、まだ接続のオーバーヘッドがあります。) – Thomas

答えて

13

私はあなたが管理するファイル の大きな木を持っている場合rsync答えに同意する傾向があるが、あなたは ファイルをコピーするにはCPに-u(--update)フラグを使用できる場合にのみオーバーソースは宛先より新しいです。

CP -u

編集

あなたは いくつかの追加のアクションを取るしたいことを示すために質問を更新しましたので、あなたが-ntチェック を使用したいと思います[test)組み込みコマンド:manページから

#!/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 

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

希望するものがあります。

0

いいえファイルが異なるかどうかを検出してファイルがコピーされている場合にのみコピーするので、ファイルをコピーするにはrsyncまたはそのフロントエンドのいずれかを使用する必要があります。

+5

'rsync'は参考になります(私の編集では分かりますが、私が必要とするものではありません)。しかし、私はあなたの調子が少しばかり離れていることを知っています。 –

+1

@Allan H .:多分私は何かを逃しているが、私はトーンが不便であるとは思わない。実際、私はあなたの反応に驚いていました。 –

3

ファイルサイズの違い(サイズが異なる場合、内容がそうである場合)と内容のハッシュを比較することにより、ファイル内容の変化を検出することがより信頼できるとわかる場合があります。おそらくSHA1またはMD5でも十分でしょうが、cksumコマンドで十分でしょう。

ファイルの変更時間はコンテンツを変更せずに変更することができます(touch file)。コンテンツを変更してもファイルの変更時刻は変更できません(これを行うのは難しくなりますが、touch -r ref-file fileを使用してfileの変更時刻をref-fileと一致させることができます)。

+0

なぜbit-for-bit比較の代わりにハッシュを使用するのですか? bit-for-bit比較は、ファイル全体を実行してハッシュを形成するよりも高速になるのではないでしょうか? – Pacerier

+1

@Pacerier:ファイルが異なる場合、最後のバイトだけが異なる場合を除いて、バイト単位の比較が速くなる可能性があります。ファイルが同じ場合は、すべてのバイトを比較することによってのみ表示できます。ハッシュの利点は、(比較的小さい)ハッシュの古い値を保存し、現在のファイルから再生成されたハッシュの新しい値と比較できることです。違いがある場合は、ファイルが変更されています。バイトごとの比較を行うには、古いファイルが存在する必要があります。 –

6

OS Xにはstatコマンドがあります。このような何かがあなたのファイルの修正時刻与える必要があります。

stat -f '%m' filename 

をGNU同等は次のようになります。

stat --printf '%Y\n' filename 
関連する問題