복사 실행 취소(cp) 명령 작업

복사 실행 취소(cp) 명령 작업

터미널에서 다음 명령줄을 사용하여 소스 폴더의 일부 파일을 대상 폴더로 복사했습니다.

sudo cp From_SOURCE/* To_DESTINATION/

이제 이 명령을 취소하고 싶습니다.

답변1

제가 잘 이해했다면 다음과 같습니다.

  • (아마도 많은) 수의 파일을 기존 디렉터리에 복사했으며 작업을 취소해야 합니다.
  • 대상 디렉토리에는 다음이 포함되어 있습니다.다른파일을 보관해야 하므로 간단히 제거할 수는 없습니다.모두디렉토리의 파일

아래 스크립트는 원본(소스) 디렉터리를 찾아 해당 파일을 나열합니다. 그런 다음 파일을 복사한 디렉토리를 조사하고 소스 디렉토리에 있는 나열된 파일만 제거합니다.

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

메모

복사 작업의 경우덮어썼다(교체) 대상에 비슷한 이름의 파일이 있으면 파일은 제거되지만 원본 파일은 (물론) 스크립트에 의해 다시 가져오지 않습니다. 이름 충돌이 없다고 가정합니다.

답변2

요약:

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_SOURCEdestTo_DESTINATION

이제 우리의 명령은 다음과 같습니다.

cp src/* dest/

, 및 src파일 과 디렉토리 및 가 포함된 경우 쉘은 해당 명령을 다음으로 확장합니다.f1f2f3d1d2

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). 너무 늦었어요. 미안해요. 최신 백업에서 다시 가져옵니다.

거기에 있는 파일과 관련하여 복사된 파일만 제거하고 싶습니다. 이러한 파일은 동일한 이름과 동일한 내용으로 두 디렉터리에 모두 존재합니다.

따라서 우리는 다음 파일을 찾습니다.

먼저 다음 명령을 훨씬 간단하게 만들고 변수를 dest의 절대 경로로 설정하기 때문에 cd에 들어갑니다 .srcfind

$ cd src
$ destdir="$(readlink -f dest)"

그런 다음 src의 모든 파일을 나열합니다.

$ find . -maxdepth 1 -type f

그리고 발견된 각 파일에 대해 cmpdest에 동일한 내용을 가진 파일이 있는지 확인하는 데 사용합니다.

$ 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에서 동일하며 이제 에 있으며 마지막으로 살펴본 후 제거할 수 있습니다.srcdest/tmp/toDelete/


참고:
(1) 먼저 질문하여 파일 덮어쓰기를 방지할 cp별칭인지 확인하세요.cp -i

답변3

이것은 오래되었지만 순수한 bash 답변을 게시하고 싶었습니다.

먼저 파일을 복사한 디렉터리로 변경합니다.

cd dest

그런 다음 ls소스 디렉터리와 출력을 다음으로 파이프합니다.rm

ls source | xargs rm

답변4

이는 복사 작업의 타임스탬프를 기반으로 한 답변입니다. 폴더 내용을 생성 시간 순서대로 나열하고 파일로 파이프할 수 있습니다.

ls -alt | file_list

file_list그런 다음 복사 작업의 타임스탬프가 동일한 파일을 열고 찾습니다. 아마도 최신 파일이 될 것 같습니다.

그런 다음 필요하지 않은 파일/폴더를 편집하고 저장 file_list합니다 .rm -rf

그런 다음 다음을 수행하십시오.

source file_list

관련 정보