ファイルとその属性の比較

ファイルとその属性の比較

毎日私は以下の特定のファイルセットに関する情報をメールで受け取ります。

58623208 Sep 14 20:08 blbn_blfbe_drv
57904920 Sep 14 19:54 blbn_cycmn
55814208 Sep 14 06:02 clsa_Upd
38912000 Sep 14 19:12 cs_chgpp
41107456 Sep 14 19:17 csmRFbe
39403520 Sep 14 19:09 csmUAddAct
39235584 Sep 14 19:20 csmUAddSub

...など、約60個のファイルがあります。

これで、すべてのファイルを既存のファイルと1つずつ比較して、すべてが一致することを確認する必要があります。

filename、、、timestampおよびdatesize一致する必要があります。

これを自動化する方法はありますか?

commまたは使用を検討していますdiff

答え1

次の-dオプションを含むGNU Dateがあるとします。

while read size mon day time filename; do
    if [[ ! -f "$filename" ]]; then
        echo "ERROR: no such file: $filename" >&2
    else
        filesize=$(stat -c %s "$filename")
        if [[ "$size" != "$filesize" ]]; then
            echo "ERROR: size mismatch: $filename" >&2
        else
            filetime=$(date -d "$(stat -c %y "$filename")" "+%b %d %H:%M")
            if [[ "$mon $day $time" != "$filetime" ]]; then
                echo "ERROR: date mismatch: $filename" >&2
            fi
        fi
    fi
done 

答え2

すべての新しいファイルがnew /にあり(または移動可能)、既存のすべてのファイルがold /ディレクトリにあると仮定すると、 'diff -ur old / new /'を使用してディレクトリ間のファイルの違いを確認できます。

違いの本質に興味がなければ、違いだけがあるだけです。事実一部のファイルが異なる場合は、grepを使用して出力をフィルタリングします。しかし、diffの終了コードは失われます(1 =違いが見つかりました)。代わりにgrepの終了コードを使用できます(1 =正規表現一致はありません。これはすべてのファイルが同じであるという意味で解釈できます)。

たとえば、古いテキストファイルと新しいテキストファイル(/bin、/sbin、および/ etcディレクトリのリストを含むゴミ)を作成しました。その後、new / basを編集していくつかの行を削除しました。

$ ls -l new old
new:
total 28
-rw-r--r-- 1 cas cas 11063 Sep 15 15:27 baz
-rw-r--r-- 1 cas cas 14529 Sep 15 15:25 foo

old:
total 20
-rw-r--r-- 1 cas cas  6843 Sep 15 15:24 bar
-rw-r--r-- 1 cas cas 12025 Sep 15 15:24 baz

まず、2つのディレクトリを比較します。

$ diff -ur old new | egrep '^(Only|diff)'
Only in old: bar
diff -ur old/baz new/baz
Only in new: foo
$ echo $?
0

ここでは、srcディレクトリとdstディレクトリが同じ場合(または内容がまったく同じ場合)に終了コードを表示できます。

$ diff -ur old old | egrep '^(Only|diff)'
$ echo $?
1

cmpを使用することもできますが、単一のファイルのみを一致させることができ、2つのディレクトリ間の違いを再帰的に確認することはできません。その周りにforループラッパーを作成し、新しいファイルにのみ存在し、古いファイルにはないファイルを考慮する必要があります。 diffを使うのは簡単です。

関連情報