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_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
훨씬 간단 명령을하고, 이명 령의 절대 경로에 변수를 설정 :
$ 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
먼저 확인하여 파일 덮어 쓰기를 방지 했는지 확인하십시오 .