毎日私は以下の特定のファイルセットに関する情報をメールで受け取ります。
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
およびdate
はsize
一致する必要があります。
これを自動化する方法はありますか?
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を使うのは簡単です。