Команда оболочки Linux для сравнения двух каталогов и удаления дубликатов

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

Пример того, что я ищу

т.е.

    /dir1/apple
    /dir1/orange
    /dir1/banana 

А также

    /dir2/orange    

После команды у меня будет:

    /dir1/apple
    /dir1/banana 

А также

    /dir2/orange  

1 ответ

Зациклите каждый файл в каталоге 2 и попробуйте удалить эквивалент с тем же именем файла (basename) в каталоге 1.

for f in dir2/*; do echo rm -f -- dir1/"$(basename "$f")"; done

Обратите внимание, что rm -f не ошибка на файлах, которые не найдены. Удалить echo когда вы уверены, что это удалит правильные вещи.

Если вы только хотите позвонить rm на существующих файлах, проверьте, если они находятся в dir1 с [[ -f … ]],

for f in dir2/*; do del=dir1/"$(basename "$f")"; [[ -f "$del" ]] && rm -- "$del"; done
Другие вопросы по тегам