我每天都会在邮件中收到一组特定文件的信息,如下所示:
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 个文件。
现在,我需要将所有这些文件与现有文件一一进行比较,以确保所有文件都匹配。
filename
、timestamp
、date
、 和size
是应该匹配的东西。
有什么办法可以自动化吗?
我正在考虑使用comm
或diff
。
答案1
我假设你有 GNU 日期,有以下-d
选项:
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/baz 并删除了一些行:
$ 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
首先,比较两个目录:
$ 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,但它只能匹配单个文件,它不能递归检查两个目录的差异。您必须围绕它编写一个 for 循环包装器,并且必须考虑仅存在于新文件但不存在于旧文件中的文件。更容易使用差异。