TL; DR :
두 파일 모두에 있으며 다음 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파일이 들어있는 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훨씬 간단 명령을하고, 이명 령의 절대 경로에 변수를 설정 :
$ 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, 아직 실제로에서 같은 src과 dest,에있다 /tmp/toDelete/, 그리고 마지막 모습을 촬영 한 후 제거 할 수 있습니다.
참고 :
(1) cp별명 인지 여부를 cp -i먼저 확인하여 파일 덮어 쓰기를 방지 했는지 확인하십시오 .