TL; DR:
Все файлы, которые присутствуют в обоих srcи destмогут быть удалены destследующим образом:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Пошаговое объяснение см. Ниже.
Упрощение проблемы:
Чтобы понять, что на самом деле сделала команда, которую мы хотим отменить, мы начнем с ее упрощения:
Команда, которую мы хотим отменить,
sudo cp From_SOURCE/* To_DESTINATION/
Для понимания, как отменить, sudoне имеет значения.
Я буду использовать имена каталогов srcдля From_SOURCEи destдля To_DESTINATION.
Теперь наша команда:
cp src/* dest/
Если srcсодержит файлы f1, f2и f3, и каталоги d1и d2, оболочка расширяет эту команду до:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Без параметров, таких как -r, -Rили -a, команда cpне копирует каталоги.
Это означает, что команда пропустит их, показывая ошибку для каждого из них:
$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'
Это означает, что мы скопировали только простые файлы, а не каталоги dest.
Решая, какие файлы удалить:
Возможно, были файлы destс тем же именем, что и файлы src. В этом случае файлы были перезаписаны (1). Слишком поздно для них, извини. Верните их из последней резервной копии.
Что касается файлов, которые там есть, мы хотим удалить только те файлы, которые были скопированы. Эти файлы существуют в обоих каталогах с одинаковым именем и одинаковым содержимым.
Итак, мы ищем эти файлы:
Во- первых, мы cdв src, потому что это делает следующие findкоманды гораздо проще, и установить переменную абсолютный путь Dest:
$ cd src
$ destdir="$(readlink -f dest)"
Затем мы перечисляем все файлы в src:
$ find . -maxdepth 1 -type f
и для каждого найденного файла используйте cmpдля проверки, есть ли файл с таким же содержимым в dest:
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print
Удаляя файлы, внимательно:
Эти файлы мы хотим удалить. Но чтобы быть уверенным, мы сначала переместим их в другой каталог - и посмотрим на команды перед их выполнением:
$ toDelete=/tmp/toDelete ; mkdir -p "$toDelete"
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec echo mv -n "$destdir/{}" "$toDelete"/ \;
mv -n /path/to/dest/./f1 /tmp/toDelete/`
mv -n /path/to/dest/./f2 /tmp/toDelete/`
mv -n /path/to/dest/./f3 /tmp/toDelete/`
Выглядит хорошо! Теперь мы можем не echoиспользовать настоящие mvкоманды:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Все файлы, destкоторые были скопированы с src, и в действительности остаются теми же в srcи dest, теперь находятся в /tmp/toDelete/, и их можно удалить после последнего просмотра.
Примечания:
(1) Проверьте, cpявляется ли псевдоним cp -iили так, который бы предотвратил перезапись файлов, сначала спросив.