Проверьте, существуют ли все файлы в каталоге в другом месте

Я собираюсь удалить старый каталог резервных копий, но перед этим я хотел бы убедиться, что все эти файлы существуют в более новом каталоге.

Есть ли инструмент для этого? Или мне лучше сделать это "вручную", используя 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.

3 ответа

Я бы сделал свой собственный инструмент. Пройдите по этому маршруту вручную с некоторыми причудливыми находками:

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

Это невероятно неряшливо, но основной алгоритм должен быть в порядке. Вы также можете сделать некоторые действия, чтобы выяснить, какие файлы не имеют копий в обоих случаях, например, так:

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

Я могу объяснить кусочки, если вам нужно.

Python имеет несколько хороших стандартных библиотечных модулей для этого, называемых dircmp/filecmp.

Из 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']

Даг объясняет полностью тощий в filecmp / dircmp лучше, чем я:

http://www.doughellmann.com/PyMOTW/filecmp/

Мне нравится python для таких вещей, потому что он гораздо проще переносить между Linux/Windows/Solaris, чем что-либо на основе оболочки.

Использовать diff -uRN dir1 dir2

Разница будет пустой, если файлы безупречны... Или покажет!

Другие вопросы по тегам