我有兩個資料夾 - 資料夾 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
的擴展(全部以 為前綴)以及數組減去數組(全部以 為前綴)的相應擴展複製到 中。A
B
folderA
B
A
folderB
folderC
答案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'