比较文件及其属性

比较文件及其属性

我每天都会在邮件中收到一组特定文件的信息,如下所示:

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 个文件。

现在,我需要将所有这些文件与现有文件一一进行比较,以确保所有文件都匹配。

filenametimestampdate、 和size是应该匹配的东西。

有什么办法可以自动化吗?

我正在考虑使用commdiff

答案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 循环包装器,并且必须考虑仅存在于新文件但不存在于旧文件中的文件。更容易使用差异。

相关内容