我即将删除一个旧的备份目录,但在执行此操作之前,我想确保所有这些文件都存在于较新的目录中。
有工具可以实现这个吗?还是我最好“手动”使用find
、、md5sum
排序、比较等来做这件事?
澄清:
如果我有以下目录列表
/path/to/old_backup/dir1/fileA
/path/to/old_backup/dir1/fileB
/path/to/old_backup/dir2/fileC
和
/path/to/new_backup/dir1/fileA
/path/to/new_backup/dir2/fileB
/path/to/new_backup/dir2/fileD
然后,fileA
和fileB
存在于new_backup
(fileA
在其原始目录中,并且fileB
已从 移动dir1
到dir2
)。fileC
另一方面, 缺失new_backup
并且fileD
已被创建。在这种情况下,我希望输出类似于
fileC exists in old_backup, but not in new_backup.
答案1
Python 有一些很好的标准库模块,称为 dircmp/filecmp。
来自Doug Hellmann的PyMOTW,这段小代码给你:
import filecmp
filecmp.dircmp('example/dir1', 'example/dir2').report()
给你:
diff example/dir1 example/dir2
Only in example/dir1 : ['dir_only_in_dir1', 'file_only_in_dir1']
Only in example/dir2 : ['dir_only_in_dir2', 'file_only_in_dir2']
Identical files : ['common_file', 'not_the_same']
Common subdirectories : ['common_dir']
Common funny cases : ['file_in_dir1']
Doug 对 filecmp/dircmp 的完整解释比我更好:
http://www.doughellmann.com/PyMOTW/filecmp/
我喜欢用 Python 来做这类事情,因为对我来说,它在 Linux/Windows/Solaris 之间的移植比任何基于 shell 的东西都要容易得多。
答案2
我会制作自己的工具。使用手动方式制作这个工具,并发现一些有趣的东西:
find /oldbackup -exec basename {} ";" > /tmp/old.txt
find /newbackup -exec basename {} ";" > /tmp/new.txt
for $filename in `cat /tmp/old.txt`
do
grep $filename /tmp/new.txt
if [ "$?" -ne "0" ];
then
echo "$filename not in new backup"
fi
done
这太草率了,但基本算法应该没问题。您还可以做一些 catting 来找出哪些文件在两个文件中都没有副本,如下所示:
find /oldbackup -exec basename {} ";" > /tmp/old.txt
find /newbackup -exec basename {} ";" > /tmp/new.txt
cat /tmp/old.txt /tmp/new.txt | sort | uniq -c | grep -v 2
如果您需要的话我可以向您详细解释一下。
答案3
使用 diff -uRN dir1 dir2
如果文件是完美的,则差异将为空...或者它会显示!