检查目录中的所有文件是否存在于其他地方

检查目录中的所有文件是否存在于其他地方

我即将删除一个旧的备份目录,但在执行此操作之前,我想确保所有这些文件都存在于较新的目录中。

有工具可以实现这个吗?还是我最好“手动”使用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

然后,fileAfileB存在于new_backupfileA在其原始目录中,并且fileB已从 移动dir1dir2)。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

如果文件是完美的,则差异将为空...或者它会显示!

相关内容