Copiando arquivos de resultados diferentes

Copiando arquivos de resultados diferentes

Eu tenho duas pastas - Pasta A e Pasta B.

Comparei os arquivos de ambas as pastas usando o comando diff. Agora, depois de descobrir que determinados arquivos estão disponíveis apenas na pasta A e determinados arquivos na pasta B, gostaria de copiar esses arquivos distintos de ambas as pastas para uma pasta chamada pasta C, que agora terá todos os arquivos exclusivos de A e B.

Como posso fazer isso?

Responder1

Você poderia usarRecursos de subtração de array e expansão de chaves do zsh, igual a:

Configurar:

$ tree .
.
├── folderA
│   ├── file0
│   ├── file1
│   └── file2
├── folderB
│   ├── file2
│   ├── file3
│   └── file4
└── folderC

3 directories, 6 files


cd folderA
A=(*)
cd ../folderB
B=(*)
cd ..

Execução:

cp folderA/${^A:|B} folderB/${^B:|A} folderC

Resultado:

$ tree folderC
folderC
├── file0
├── file1
├── file3
└── file4

0 directories, 4 files

As duas etapas de configuração criam matrizes (nomeadas Ae B) que contêm os nomes dos arquivos nas pastas A e B, respectivamente.

A etapa de execução pede cppara copiar a expansão do Aarray menos o Barray, todos prefixados com, folderAbem como a expansão correspondente do Barray menos o Aarray (todos prefixados com folderB) em folderC.

Responder2

Uma solução hacky usando diffe :sedxargs

Configuração de teste:

$ 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

Agora usamos sedpara filtrar todas as linhas começando com string Only in folderA:e alteramos esta parte para folderA/para formar um nome de arquivo relativo entre aspas ( 'folderA/fi le1'). Essa string é então canalizada xargse usada para copiar esse arquivo para 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'

O mesmo que acima para folderB:

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderB\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderB/file4' -> 'folderC/file4'

informação relacionada