Как удалить одинаковые файлы в двух каталогах со сравнением в linux?

Я хочу удалить одни и те же файлы в двух каталогах. Оба имеют так много файлов с тем же именем. Если два файла одинаковы, я хочу удалить их в первом каталоге. Я не уверен, лучше ли выбрать оболочку linux или python.

  1. $HOME/bin
  2. $HOME/cin

В каком-то поиске есть близкий ответ для сравнения.

find cin -type f -exec cmp '{}' "bin/{}" \;

Но это не работает, потому что первый вывод find, {} содержит имя каталога «cin/», например «cin/file1». Таким образом, второй «bin/{}» имеет «bin/cin/file1». Затем возникает ошибка сравнения

cmp: bin/cin/file1: No such file or directory

как сравнить cin/file1 и bin/file1?


person Joonho Park    schedule 20.06.2018    source источник
comment
И я пробовал -printf %f\n или basename {}. Они просто влияют на стандартный вывод для поиска, но похоже, что они не входят в {}.   -  person Joonho Park    schedule 20.06.2018
comment
Вы можете запустить его из папки cin (find . -type ...) и вместо этого использовать ../bin/{}. Это должно решить проблемы с bin/cin/ путями.   -  person hradecek    schedule 20.06.2018
comment
Рассматривали ли вы возможность использования fdupes?   -  person Socowi    schedule 20.06.2018
comment
@hradecek, верно! Это работает, если он работает внутри каталога.   -  person Joonho Park    schedule 21.06.2018


Ответы (1)


Вы можете использовать эту команду find:

find cin -type f -exec bash -c 'f="${1#cin/}"; cmp "cin/$f" "bin/$f"' _ {} \;

Он выполняет команду внутри bash -c для всех обычных файлов в каталоге cin.

Верхний каталог удаляется с помощью bashism ${1#...}, а для переменной f устанавливается относительный путь.

person oliv    schedule 20.06.2018
comment
Не могли бы вы рассказать подробнее о башизме или сослаться на дополнительную веб-страницу? и какова роль подчеркивания, '_'? - person Joonho Park; 21.06.2018
comment
Вы можете посмотреть man --pager='less -p \\${parameter#' bash для своего первого вопроса и эту ссылку для вашего второго. - person oliv; 21.06.2018