Tudo que você precisa é
cp -n dir2/* dir1/* dir3/
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
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.
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.
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:
cp -pu dir1/* dir2/* dir3/
não copiará os arquivos atualizados) dir3
deve existir.