Копирование файлов результатов сравнения

Копирование файлов результатов сравнения

У меня есть две папки — папка A и папка B.

Я сравнил файлы из обеих папок с помощью команды diff. Теперь, обнаружив, что определенные файлы доступны только в папке A, а определенные файлы — в папке B, я хотел бы скопировать эти отличительные файлы из обеих папок в одну папку под названием папка 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и 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'

Связанный контент