Copie as diferenças entre dois dirs para um novo diretório?

0

Versão editada para uma pergunta apressada!

Quando executo o diff em dois diretórios ex: $ diff Linux1 Linux2

A saída é $ Only no Linux2: COMPLETELYDIFFERENT22.txt

Eu quero copiar o arquivo (não apenas a saída) para um novo diretório, criado no mesmo comando. Eu já vi essa pergunta muitas vezes, mas nenhuma das respostas funciona! Tenho certeza de que a resposta é frustrantemente simples, mas eu simplesmente não consigo encontrá-la.

    
por SimplySimplified 19.01.2018 / 13:08

1 resposta

1

Se eu entendi corretamente, você deseja comparar arquivos em dois diretórios e copiar os arquivos com conteúdo diferente para um terceiro diretório. Eu não vejo uma maneira de fazer isso com apenas um comando (a menos que você escreva seu próprio script ou função). Mas um dos pontos strongs do bash shell é que você pode encadear comandos, usando a saída de um comando como a entrada do próximo.

Primeiro, você pode usar o diff como de costume:

diff -q dir1/ dir2/

Isso lhe dará uma saída ao longo das linhas de

Files dir1/file2.txt and dir2/file2.txt differ
Files dir1/file3.txt and dir2/file3.txt differ

Agora, você precisa extrair os caminhos de arquivo dessa saída. Você pode usar vários comandos para fazer isso, cut , grep , sed , awk ou outros. Vou usar awk neste exemplo e extrair os arquivos de dir2 :

diff -q dir1 dir2 | awk -n '{ print $4 }'

A saída deste pipeline seria algo como

dir2/file2.txt
dir2/file3.txt

Essa saída agora pode ser enviada para xargs da seguinte forma:

diff -q dir1 dir2 | awk -n '{ print $4 }' | xargs -d '\n' -I {} cp {} target-dir/

Por favor, note que este método só funciona quando os arquivos diferentes existem em ambos os diretórios. Se houver um arquivo que exista apenas em um dos dois diretórios, a saída diff s será diferente, o que fará com que o corte do nome do arquivo falhe. Além disso, os nomes dos arquivos não devem conter espaços, porque isso também traria o corte.

    
por Henning Kockerbeck 20.01.2018 / 15:46