複製差異結果文件

複製差異結果文件

我有兩個資料夾 - 資料夾 A 和資料夾 B。

我使用 diff 命令比較了兩個資料夾中的檔案。現在,在發現某些文件僅在資料夾A 中可用而某些文件僅在資料夾B 中可用後,我想將這兩個資料夾中的這些獨特文件複製到1 個名為資料夾C 的資料夾中,該資料夾現在將包含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和的hacky 解決方案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'

相關內容