Некоторые реализации 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
Если цель состоит в том, чтобы сохранить содержимое файла (избежать потери данных ), я бы сосредоточился на равенстве файлов, а не на именовании каталогов файлов.
Начните с запуска этого в каждой из папок верхнего -уровня и сохраните результат (, он будет работать какое-то время! ).
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% по вашей оценке ), а затем оценивать несоответствия для любого шаблона, который вы можете использовать для согласования остальных.
Сделайте что-нибудь простое, скопируйте один каталог в другой и игнорируйте/заменяйте идентичные (файлы по пути ). Если это создаст несколько дубликатов (другой путь, одно и то же имя файла ), вы можете попытаться найти их позже.
Хотите решение с графическим интерфейсом? Используйте mc . На вопрос, что делать с дубликатами, вы можете выбрать «обновить» или «если размер отличается».
Или используйте архиватор, такой как zip/7z/rar/tar, запакуйте dir1 в архив и обновите с помощью dir2. Это позволит избежать дубликатов, и вы получите одну обновленную резервную копию.
ПС. recursively ignoring sub-directories
противоречие. Можете ли вы объяснить это, поскольку это более чем неясно.