Назад | Перейти на главную страницу

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

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

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

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

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

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