Comparando cada arquivo em dois diretórios e copiando-o para outro se ele difere de seu equivalente

3

Como posso comparar todos os arquivos em dois diretórios e copiar os que são diferentes para outro diretório? Por exemplo, digamos que temos dir1 e dir2 :

dir1:
     build.gradle
     gradle.properties
     somejar.jar
     javacode.java
     anotherjar.jar

dir2:
     build.gradle      <-- different from build.gradle in dir1
     gradle.properties
     somejar.jar
     javacode.java     <-- different from javacode.java in dir1
     yetanotherjar.jar

Como posso criar um novo diretório dir3 que contenha os arquivos diferentes de dir2 , os arquivos comuns em dir1 e dir2 e todos os arquivos incomuns em dir1 e dir2 ? dir3 deve conter:

dir3:
     build.gradle      <-- from dir2
     gradle.properties <-- these are common files both in dir1 and dir2
     somejar.jar       <--
     javacode.java     <-- from dir2
     anotherjar.jar    <-- from dir1
     yetanotherjar.jar <-- from dir2
    
por Sebi 18.07.2015 / 14:44

4 respostas

5

Tudo que você precisa é

cp -n dir2/* dir1/* dir3/
    
por 18.07.2015 / 15:31
3

Entendo corretamente que dir3 deve conter todos os arquivos dos dois diretórios base e, se um arquivo aparecer nos dois diretórios, o arquivo de dir2 deve ser usado? Então um simples

cp dir1/* dir3/
cp dir2/* dir3/

deve fazer o truque: Arquivos que diferem em ambos os diretórios de origem serão sobrescritos com a versão de dir2 . Se você não quiser copiar arquivos idênticos duas vezes, poderá também rsync em vez de cp ing.

    
por 18.07.2015 / 15:25
1

Uma maneira de fazer isso:

cp -a /path/to/dir2/* /path/to/dir3
cd /path/to/dir1
comm -23 <(ls -1 | sort) <(cd /path/to/dir2; ls -1 | sort) | cpio -pam /path/to/dir3

Isso pressupõe que você tenha apenas arquivos (ou seja, nenhum subdiretório) em dir1 e dir2 , e seus nomes de arquivos não contêm novas linhas. Ele também assume que seu shell é inteligente o suficiente para manipular <(...) de construções.

    
por 18.07.2015 / 15:15
0

cp -pu dir2/* dir1/* dir3/

do homem:

-p    same as --preserve=mode,ownership,timestamps
-u    copy only when the SOURCE file is  newer  than  the  destination
      file or when the destination file is missing

Nota:

  1. Sempre coloque o diretório atualizado primeiro. (Do exemplo acima: cp -pu dir1/* dir2/* dir3/ não copiará os arquivos atualizados)
  2. dir3 deve existir.
por 18.07.2015 / 16:35