차이점 결과 파일 복사

차이점 결과 파일 복사

폴더 A와 폴더 B라는 두 개의 폴더가 있습니다.

diff 명령을 사용하여 두 폴더의 파일을 비교했습니다. 이제 특정 파일은 폴더 A에서만 사용할 수 있고 특정 파일은 폴더 B에서만 사용할 수 있다는 것을 확인한 후 두 폴더의 고유한 파일을 폴더 C라는 폴더 1개에 복사하고 싶습니다. 이제 A와 B의 모든 고유 파일이 포함됩니다.

어떻게 해야 하나요?

답변1

당신은 사용할 수 있습니다zsh의 배열 빼기 및 중괄호 확장 기능, 다음과 같습니다:

설정:

$ tree .
.
├── folderA
│   ├── file0
│   ├── file1
│   └── file2
├── folderB
│   ├── file2
│   ├── file3
│   └── file4
└── folderC

3 directories, 6 files


cd folderA
A=(*)
cd ../folderB
B=(*)
cd ..

실행:

cp folderA/${^A:|B} folderB/${^B:|A} folderC

결과:

$ tree folderC
folderC
├── file0
├── file1
├── file3
└── file4

0 directories, 4 files

두 가지 설정 단계에서는 각각 폴더 A와 B의 파일 이름을 포함하는 배열( A및 이름)을 만듭니다.B

실행 단계에서는 배열에서 배열을 뺀 cp확장 (모두 접두사가 붙음) 과 배열에서 배열을 뺀 해당 확장 (모두 접두사가 붙음 )을 에 복사하도록 요청합니다 .ABfolderABAfolderBfolderC

답변2

diff, sed및 다음 을 사용하는 해키 솔루션 xargs:

테스트 설정:

$ mkdir folderA folderB folderC
$ touch folderA/fi\ le1 folderA/file2 folderA/file3 folderB/file3 folderB/file4
$ diff -rq folderA folderB
Only in folderA: fi le1
Only in folderA: file2
Only in folderB: file4

sed이제 문자열로 시작하는 모든 줄을 필터링하는 데 사용 Only in folderA:하고 이 부분을 로 변경하여 folderA/따옴표( )가 있는 상대 파일 이름을 형성합니다 'folderA/fi le1'. 그런 다음 이 문자열은 파이프로 연결되어 xargs이 파일을 에 복사하는 데 사용됩니다 folderC.

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderA\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderA/fi le1' -> 'folderC/fi le1'
'folderA/file2' -> 'folderC/file2'

다음에 대해서는 위와 동일합니다 folderB.

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderB\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderB/file4' -> 'folderC/file4'

관련 정보