我用来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
在这种情况下,我建议您运行以下程序