Действие команды «Отменить копию» (cp)

Помимо Windows Ubuntu будет обнаруживать ваше оборудование при загрузке, а не при установке. Поэтому можно установить Ubuntu на переносной диск для загрузки на другой машине:

Как установить Ubuntu на USB-ключ? (без использования Startup Disk Creator)

Однако иногда могут возникнуть проблемы, когда аппаратное обеспечение целевой машины нуждается в дополнительных драйверах, которые необходимо установить, или если вы установили дополнительные драйверы для оборудования, которые несовместимы с целевая машина.

1
задан 29 August 2014 в 00:05

2 ответа

TL; DR:

Все файлы, которые присутствуют в обоих src и dest, можно удалить из dest следующим образом:

find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;

Упрощение проблемы:

Чтобы понять, что команда, которую мы хотим отменить, на самом деле, мы начинаем с ее симуляции: [!d4 ]

Команда, которую мы хотим отменить, -

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, и по-прежнему на самом деле одинаковы в [ f40] и dest, теперь находятся в /tmp/toDelete/ и могут быть удалены после последнего взгляда.

Примечания: (1) Проверьте, является ли cp псевдонимом cp -i или так, что предотвратило бы перезапись файлов, спросив сначала.

6
ответ дан 24 May 2018 в 04:47

Это старое, но я просто хотел опубликовать чистый ответ bash:

Сначала перейдите в каталог, в котором вы скопировали файлы.

cd dest

Затем ls исходный каталог и выведите вывод в rm

ls source | xargs rm

4
ответ дан 24 May 2018 в 04:47

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

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