Я скопировал некоторый файл из исходной папки в папку назначения с помощью приведенной ниже командной строки в терминале.
sudo cp From_SOURCE/* To_DESTINATION/
Теперь я хочу отменить эту команду.
Если я понимаю хорошо, следующее имеет место:
сценарий ниже взглядов в оригинале (источник) каталог и перечисляет те файлы. Тогда это изучает каталог, Вы скопировали файлы в и удаляете только перечисленные файлы, поскольку они существуют в исходном каталоге.
try
элемент добавляется для предотвращения ошибок, например в случае, если Вы вручную уже, возможно, удалили некоторые файлы, или если не все файлы из исходного каталога были скопированы в место назначения. Если Вы нуждаетесь в sudo полномочиях, просто выполняете сценарий с "sudo" (см. ниже).
#!/usr/bin/env python
import os
source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to
for root, dirs, files in os.walk(source_dir):
for name in files:
try:
os.remove(target_folder+"/"+name)
except FileNotFoundError:
pass
reverse.py
, Выполнение это командой:
[sudo] /path/to/reverse.py
Первый примеряет тестовый каталог, если я понял хорошо, чего необходимо достигнуть!
<час>В случае, если исходный каталог не имеет никаких подкаталогов, сценарий может даже быть более простым:
#!/usr/bin/env python
import os
source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to
for file in os.listdir(source_dir):
try:
os.remove(target_folder+"/"+file)
except FileNotFoundError:
pass
Примечание
, Если действие копии перезаписало (заменило) столь же именованный файл в месте назначения, файл будет удален, но исходный файл не будет (конечно), возвращен сценарием. Предположение - то, что нет никаких столкновений имени.
Все файлы, которые присутствуют в обоих src
и dest
может быть удален из dest
как это:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Для пошагового, объяснения, посмотрите ниже.
Понять, что команду мы хотим отменить на самом деле, сделало, мы запускаем simpifying ее:
Команда, которую мы хотим отменить,
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
или так, который предотвратил бы файлы перезаписи путем выяснения сначала.
Это старо, но я просто хотел отправить чистый ответ удара:
Первое изменение в каталоге, где Вы скопировали файлы.
cd dest
Затем ls
исходный каталог и канал вывод в rm
ls source | xargs rm