Как убрать дубликаты, существующие в одной папке от другого рекурсивно?

Сводка: Папка A имеет только много Папок файлов Excelent B, имеет много папок смешанных Excelent/Good/Bad файлов, Как я могу удалить файлы в папках Folder B только в случае, если они будут в Папке A. Или просто помещение того же самого: Как сделать проверку Папки файлами, если они существуют в папках Folder B, затем удаляют из папок Folder B?

Идея решения, Возможно, ведьма команды:

  1. Часть проверок алфавита как весь запуск с A
  2. Выполнение удаления на файлах найдено в подпапках Folder B
  3. Повторитесь 1. + один алфавит.

Программы дублирования причины были плохи:

  1. Долгое время до 1-го удаления - его единственное, когда закончено сканируя
  2. И не возможный выбрать удаление в Папке B. Ее возможное только для хранения последним и что-то еще также, но не путем желания в папке ведьмы сохранить.

Бесполезная история: Файлы были скопированы с Recuva в Папке B и частично расположены, но многие из них плохи таким образом 1-е, я думаю Папка B сравнение, если существуют тем, околдовывают восстановленный снова, но теперь просто Excelent, восстановленный в Папке Recuva так большинство Excelent, будет только в Папке A.

Дерево файла в качестве примера:

.
├── A
│  ├── 1.png
│  ├── 2.png
│  └── Excellent
│  ├── e1.png
│  └── e2.png
└── B
    ├── 1.png
    ├── 2.png
    ├── Bad
    │  ├── 1.png
    │  ├── 2.png
    │  ├── e1.png
    │  └── e2.png
    └── Excellent
        ├── e1.png
        └── e2.png
4
задан 15 January 2013 в 09:25

1 ответ

Ниже два решения, в зависимости от того, как мы определяем "дубликат":

  • Файлы с тем же относительным путем, или
  • Файлы с тем же содержанием, но не обязательно тем же именем

Если "дубликатом" мы имеем в виду два файла, которые совместно используют тот же относительный путь, то Вы могли использовать find и xargs удалить дубликаты. Например, предположите, что Вы имеете

~/tmp% tree A
A
└── Excellent
    ├── bar
    ├── baz
    └── foo
~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
│   ├── bar
│   ├── baz
│   └── foo
└── Good

Затем

find /home/unutbu/tmp/A  -depth -type f -print0 | xargs -0 -I{} bash -c 'rm "/home/unutbu/tmp/B${1#*A}"' - {}

результаты в

~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
└── Good

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

sudo apt-get install rdfind

Если у нас есть эта структура каталогов:

~/tmp% tree A
A
└── Excellent
    ├── bar
    ├── baz
    └── foo

1 directory, 3 files
~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
│   ├── barbar
│   ├── bazbaz
│   └── foofoo
└── Good

где barbar имеет то же содержание как bar, и так же для bazbaz и foofoo, затем

rdfind -deleteduplicates true A B

результаты в

~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
└── Good

Альтернативное решение в случае, если Ваша версия Ubuntu не включает rdfind:

Вы могли вместо этого использовать fdupes:

sudo apt-get install fdupes
fdupes --recurse --delete --noprompt A B 
6
ответ дан 15 January 2013 в 09:25

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

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