
Я реорганизовываю некоторые файлы на жестком диске и у меня есть старая копия папки. Я хочу убедиться, что каждый файл в папке A (старая копия) существует в папке B. Каждая папка содержит не менее 200 файлов, большинство из которых, скорее всего, являются дубликатами.
Предостережение: я не могу просто проверить имена файлов, я должен также убедиться, что они имеют одинаковое содержимое (а-ля fdupes
).
Я проверил страницу руководства, fdupes
нет ли способа выполнить обратную операцию (т. е. выяснить, какие файлынеесть какие-либо копии), но остался ни с чем, даже если бы такая функциональность существовала, у меня все равно есть файлы, которые существуют только в папке B.
Эти два вопроса были похожи, но касались только Windows, поэтому не особо помогли:
- Как найти все папки в папке A, которых нет в папке B?
- Удалять файлы из одной папки, если в другой папке нет файла с таким же именем.
Заранее спасибо.
решение1
Если у вас уже есть список дубликатов файлов, просто сравните его со списком всех файлов, чтобы найти нужные:
fdupes -r dir1 dir2 | grep -vwFf- <(find dir1 dir2 -type f)
-w
сопоставляет только целые слова (не подстроки, поэтому файлabcd
не сопоставляется сabc
)-F
считает шаблоны буквальными, а не регулярными выражениями-f
использует указанный файл (-
в данном случае стандартный ввод) в качестве списка выражений для сопоставления.-v
как вы, вероятно, знаете, показывает несовпадающие строки.
Это должно вывести список, содержащий файлы, найденные только в одной из папок. Должно быть легко проверить, что все они находятся в папке B, просмотрев или выполнив поиск по имени папки A (ниже называемой dir1
), например:
fdupes -r dir1 dir2 | grep -vwFf- <(find dir1 dir2 -type f) | grep -F dir1