Я скопировал некоторый файл из исходной папки в папку назначения с помощью приведенной ниже командной строки в терминале.
sudo cp From_SOURCE/* To_DESTINATION/
Теперь я хочу отменить эту команду.
command-line
cp
αғsнιη
источник
источник
From_SOURCE/*
и удалить их изTo_DESTINATION/
; это может быть сделано с помощью bash - проблемы здесь могут быть связаны с тем, что команда cp перезаписывает что-либо, символические ссылки были скопированы, файлы с пробелами в именах и т. д. Идеальный вариант «отменить» мог бы учитывать множество вещей.Ответы:
Если я хорошо понимаю, это так:
Сценарий ниже ищет в исходном (исходном) каталоге и перечисляет эти файлы. Затем он просматривает каталог, в который вы скопировали файлы, и удаляет только перечисленные файлы, поскольку они существуют в исходном каталоге.
try
Элемент добавляется для предотвращения ошибок, например , в случае , если вы могли бы удалить некоторые файлы вручную уже, или если не все файлы из исходного каталога были скопированы в месте назначения. Если вам нужны привилегии sudo, просто запустите скрипт с «sudo» (см. Ниже).Сценарий
Как пользоваться
reverse.py
,Запустите его командой:
Предупреждение
Сначала попробуйте тестовый каталог, если я хорошо понимаю, чего вам нужно достичь!
Если источник является «плоским»
Если в исходном каталоге нет подкаталогов, сценарий может быть даже проще:
Заметка
Если действие копирования перезаписало (заменило) файл с аналогичным именем в месте назначения, файл будет удален, но исходный файл (конечно) не будет возвращен сценарием. Предполагается, что нет столкновения имен.
источник
sudo python3 reverse.py
. Я принимаю ваш ответ.cp
.cp -r
. Я изменилos.remove
сprint
, и он выводит кучу файлов, которые не существуют. Я предполагаю, что в нем отсутствуют подкаталоги, и только список файлов в конце.TL; DR:
Все файлы, которые присутствуют в обоих
src
иdest
могут быть удаленыdest
следующим образом:Пошаговое объяснение см. Ниже.
Упрощение проблемы:
Чтобы понять, что на самом деле сделала команда, которую мы хотим отменить, мы начнем с ее упрощения:
Команда, которую мы хотим отменить,
Для понимания, как отменить,
sudo
не имеет значения.Я буду использовать имена каталогов
src
дляFrom_SOURCE
иdest
дляTo_DESTINATION
.Теперь наша команда:
Если
src
содержит файлыf1
,f2
иf3
, и каталогиd1
иd2
, оболочка расширяет эту команду до:Без параметров, таких как
-r
,-R
или-a
, командаcp
не копирует каталоги.Это означает, что команда пропустит их, показывая ошибку для каждого из них:
Это означает, что мы скопировали только простые файлы, а не каталоги
dest
.Решая, какие файлы удалить:
Возможно, были файлы
dest
с тем же именем, что и файлыsrc
. В этом случае файлы были перезаписаны (1). Слишком поздно для них, извини. Верните их из последней резервной копии.Что касается файлов, которые там есть, мы хотим удалить только те файлы, которые были скопированы. Эти файлы существуют в обоих каталогах с одинаковым именем и одинаковым содержимым.
Итак, мы ищем эти файлы:
Во- первых, мы
cd
вsrc
, потому что это делает следующиеfind
команды гораздо проще, и установить переменную абсолютный путь Dest:Затем мы перечисляем все файлы в src:
и для каждого найденного файла используйте
cmp
для проверки, есть ли файл с таким же содержимым в dest:Удаляя файлы, внимательно:
Эти файлы мы хотим удалить. Но чтобы быть уверенным, мы сначала переместим их в другой каталог - и посмотрим на команды перед их выполнением:
Выглядит хорошо! Теперь мы можем не
echo
использовать настоящиеmv
команды:Все файлы,
dest
которые были скопированы сsrc
, и в действительности остаются теми же вsrc
иdest
, теперь находятся в/tmp/toDelete/
, и их можно удалить после последнего просмотра.Примечания:
(1) Проверьте,
cp
является ли псевдонимcp -i
или так, который бы предотвратил перезапись файлов, сначала спросив.источник
Это старый, но я просто хотел опубликовать чистый ответ:
Сначала перейдите в каталог, куда вы скопировали файлы.
cd dest
Затем,
ls
исходный каталог и направить вывод вrm
ls source | xargs rm
источник
ls
как правило, плохая идея. mywiki.wooledge.org/ParsingLs Я не буду опускать ваше сообщение, но оно должно быть отмечено.