![复制差异结果文件](https://linux22.com/image/154741/%E5%A4%8D%E5%88%B6%E5%B7%AE%E5%BC%82%E7%BB%93%E6%9E%9C%E6%96%87%E4%BB%B6.png)
我有两个文件夹 - 文件夹 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'