差异:文件名略有不同,同一文件

差异:文件名略有不同,同一文件

我用来diff -rq比较 Mac OS X 10.6 服务器上的目录。在folder1 中,我们有“文件名”。在folder2 中,我们有“filename.archive”,因为folder2 是由文件同步应用程序创建的,该应用程序还对其同步的文件进行存档。

我们刚刚从备份中提取了folder1,我想看看folder2 中的内容是最新的并且可以复制。

我该怎么做?具体来说,我问如何以这样的方式进行比较,即“文件”的评估相当于“file.archive”,并且最好是通过文件内容或校验和,而不是文件名。

答案1

您不能使用“just”来执行此操作,diff因为两个目录中的文件名都不匹配,并且 diff 没有内置任何内容来进行映射。


您可以做的是更改为“新”目录并执行以下操作:

for i in *; do diff "$i" /path/to/other/dir/"$i"; done

或者,更改到恢复的备份目录并执行以下操作:

for i in *.archive; do diff "$i" /path/to/new/dir/"${i%.archive}"; done

如果这扩展到整个目录结构,这会变得更加复杂。如果原始文件在下面a,备份暂时恢复在下面backup/b

.
├── a
│   ├── p
│   │   ├── x
│   │   ├── y
│   │   └── z
│   └── q
│       ├── 1
│       ├── 2
│       └── 3
└── backup
    └── b
        ├── p
        │   ├── x.archive
        │   ├── y.archive
        │   └── z.archive
        └── q
            ├── 1.archive
            ├── 2.archive
            └── 3.archive

您可以运行以下脚本python toddiff.py a backup/b > todiff (上面的树结构中未列出 todiff)。

import sys
import os

base = sys.argv[1]
if base[-1] != '/':
    base += '/'  # this last / needs to be removed to create bup_file_name
backup = sys.argv[2]

for root, directory_names, file_names in os.walk(base):
    for file_name in file_names:
        full_name = os.path.join(root, file_name)
        bup_file_name = os.path.join(backup, full_name.replace(base, '', 1))
        bup_file_name += '.archive'
        # adjust the diff options to your need in the following line
        print('diff -u "{}" "{}"'.format(full_name, bup_file_name))

这将生成以下形式的文件:

diff -u "a/q/3" "backup/b/q/3.archive"
diff -u "a/q/1" "backup/b/q/1.archive"
diff -u "a/q/2" "backup/b/q/2.archive"
.
.

然后您可以通过以下方式获取:source ./todiff

在这种情况下,我建议您运行以下程序

相关内容