Действие команды отмены копирования (cp)

Я скопировал некоторый файл из исходной папки в папку назначения с помощью приведенной ниже командной строки в терминале.

sudo cp From_SOURCE/* To_DESTINATION/

Теперь я хочу отменить эту команду.

14
задан 28 August 2014 в 23:05

3 ответа

Если я понимаю хорошо, следующее имеет место:

  • Вы скопировали (по-видимому, большой) количество файлов на существующем каталоге, и Вам нужно / хотят инвертировать действие.
  • целенаправленный каталог содержит много другой файлы, которые необходимо сохранить там, который лишает возможности просто удалять весь файлы из каталога

сценарий ниже взглядов в оригинале (источник) каталог и перечисляет те файлы. Тогда это изучает каталог, Вы скопировали файлы в и удаляете только перечисленные файлы, поскольку они существуют в исходном каталоге.

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
    

Предупреждение

Первый примеряет тестовый каталог, если я понял хорошо, чего необходимо достигнуть!

<час>

, Если sourcedirectory "плоский"

В случае, если исходный каталог не имеет никаких подкаталогов, сценарий может даже быть более простым:

#!/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

Примечание

, Если действие копии перезаписало (заменило) столь же именованный файл в месте назначения, файл будет удален, но исходный файл не будет (конечно), возвращен сценарием. Предположение - то, что нет никаких столкновений имени.

0
ответ дан 28 August 2014 в 23:05

TL; DR:

Все файлы, которые присутствуют в обоих 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 или так, который предотвратил бы файлы перезаписи путем выяснения сначала.

7
ответ дан 28 August 2014 в 23:05

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

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

cd dest

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

ls source | xargs rm

5
ответ дан 28 August 2014 в 23:05
  • 1
    Уверенный сделал! Мерцание является проблемой со следующим за DRM ядром. Я узнал позже, что ядра, расположенные здесь, работают лучше (и don' t имеют мерцание): kernel.ubuntu.com/~kernel-ppa/mainline/v4.4-wily я забыл обновлять свое решение, таким образом, я просто обновил его с лучшей ссылкой. – Jay LaCroix 8 February 2016 в 16:55

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

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