У меня есть две папки — папка 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'