Сравните большие каталоги рекурсивно - но игнорируя подкаталоги - сравните две резервные копии - с графическим интерфейсом

Некоторые реализации duподдерживают -d¹ для ограничения глубины отображения использования диска (не учитывают использование диска ), поэтому du -hd 1.должно работать для текущего каталога.

Переносимо всегда можно сделать:

find. ! -name. -prune -type d -exec du -s {} +

(добавьте -h, если ваша реализация duподдерживает это)

Однако обратите внимание, что если в текущем каталоге много каталогов, findможет привести к нескольким вызовам du, что может означать, что некоторые жесткие ссылки учитываются несколько раз. Некоторые реализации duтакже не предотвращают многократный подсчет жестких ссылок, если они встречаются при обходе различных аргументов.


¹, в старых версиях GNU duвам может понадобиться --max-depth. Эквивалент короткой опции -dбыл добавлен только в coreutils 8.8 для совместимости с FreeBSD

0
26.01.2020, 15:10
2 ответа

Если цель состоит в том, чтобы сохранить содержимое файла (избежать потери данных ), я бы сосредоточился на равенстве файлов, а не на именовании каталогов файлов.

Начните с запуска этого в каждой из папок верхнего -уровня и сохраните результат (, он будет работать какое-то время! ).

find FolderA -type f -print0 | xargs -0 cksum > FoldA.cksum
find FolderB -type f -print0 | xargs -0 cksum > FoldB.cksum

Сортировка двух выходных данных вместе, которая объединяет любое идентичное содержимое файла. Затем начните писать awk для группировки идентичного контента на основе первых двух полей (контрольной суммы и размера ).

(a )Любая -группа строк является уникальным файлом, который необходимо сохранить.
(b )Любая большая группа представляет собой список идентичных файлов. С тем же успехом можно оставить первое имя и записать остальные имена в список для удаления (. Это могут быть дубликаты между A и B, или внутри A, или внутри B, или и там, и там.

Все повторяющиеся файлы теперь будут только в вашем имени FolderA, как и около половины уникальных файлов.Что вы делаете с файлами, в которых выбранная копия находится в папке B (, если вам нужно объединить остатки )?

Если их имя пути (после папки B до самого нижнего каталога )существует в папке A, возможно, именно туда вам нужно указать их через другой список вывода.

Если их имя пути в FolderA не существует, вы можете догадаться, где они на самом деле принадлежат. Вы можете создать соответствующий каталог (со всеми его родительскими каталогами )и рискнуть потерять его, или проверить его на глаз, чтобы увидеть, соответствует ли он где-либо еще.

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

Мой подход заключается в том, чтобы работать с этим постепенно :сначала с точными дубликатами файлов (90% по вашей оценке ), а затем оценивать несоответствия для любого шаблона, который вы можете использовать для согласования остальных.

1
28.01.2020, 02:54

Сделайте что-нибудь простое, скопируйте один каталог в другой и игнорируйте/заменяйте идентичные (файлы по пути ). Если это создаст несколько дубликатов (другой путь, одно и то же имя файла ), вы можете попытаться найти их позже.

Хотите решение с графическим интерфейсом? Используйте mc . На вопрос, что делать с дубликатами, вы можете выбрать «обновить» или «если размер отличается».

Или используйте архиватор, такой как zip/7z/rar/tar, запакуйте dir1 в архив и обновите с помощью dir2. Это позволит избежать дубликатов, и вы получите одну обновленную резервную копию.

ПС. recursively ignoring sub-directoriesпротиворечие. Можете ли вы объяснить это, поскольку это более чем неясно.

0
28.01.2020, 02:54

Теги

Похожие вопросы