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 A
e B
) que contêm os nomes dos arquivos nas pastas A e B, respectivamente.
A etapa de execução pede cp
para copiar a expansão do A
array menos o B
array, todos prefixados com, folderA
bem como a expansão correspondente do B
array menos o A
array (todos prefixados com folderB
) em folderC
.
Responder2
Uma solução hacky usando diff
e :sed
xargs
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 sed
para 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 xargs
e 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'