폴더 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
배열의 확장(모두 접두사가 붙음)과 배열에서 배열을 뺀 해당 확장(모두 접두사가 붙음)을 에 복사해야 합니다.A
B
folderA
B
A
folderB
folderC
답변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'