Diferença entre o diretório local e o remoto

2

Eu quero comparar meu diretório local e meu diretório remoto.

Exemplo: considere dois diretórios como diretório local e remoto

|-local
|  |--aaa
|  |   |--file1
|  |   |--file2
|  |
|  |--bbb
|  |   |--file1
|  |   |--file2
|  |-file1
|
|-remote
   |--ddd
       |--file1
       |--file2

Se eu tentar executar o rsync

rsync -avcn local/ remote/

Estou recebendo a seguinte saída

./
file1
aaa/
aaa/file1
aaa/file2
bbb/
bbb/file1
bbb/file2

Existe uma maneira pela qual eu só posso obter o nome da pasta se todos os arquivos também estiverem ausentes do local

Saída excluída:

file1
aaa/
bbb/

Aqui file1 e file2 estão presentes em "aaa" e "bbb", portanto, apenas o nome da pasta deve estar visível na saída.

    
por Vineet Palan 20.02.2018 / 23:38

2 respostas

0

Você pode enviar seu comando para o seguinte script awk.

$ rsync -avcn local/ remote/ | awk 'BEGIN {prev="./"} substr($0, 0, (length(prev))) != prev {print $0; prev = $0}'
file1
aaa/
bbb/

Explicação

  • {prev="./"} : antes de começar a ler a entrada, defina a variável prev para ./ (que é a primeira linha da saída). A partir daqui, usaremos essa variável para armazenar o conteúdo da linha anterior.
  • substr($0, 0, (length(prev))) : extrai um substr ing da linha inteira $0 , iniciando no primeiro caractere 0 e com comprimento desde que a linha anterior (length(prev)) .
  • != prev : compara a subcadeia da linha atual com a linha anterior. Essencialmente, isso testa se a linha atual (a substring) começa com a string da linha anterior. Nós não usamos uma regex simples aqui (ancorada no início da linha), porque teríamos que escapar dela.
  • {print $0; prev = $0} : se a linha atual faz iniciar com a linha anterior, então ignore-a (ou seja, não a imprima), se ela não for , então é um novo diretório, então imprima toda a linha print $0 e armazene a nova linha no prev variable prev = $0 .
por 22.02.2018 / 22:08
0

Sua melhor aposta, eu acho, é usar find <dir> -maxdepth 1 -type d contra os dois diretórios e comparar os resultados classificados. Similarmente à solução de Paul T, mas com um limite de profundidade e considerando apenas diretórios:

$ cd <local_folder>; find . -type d -maxdepth 1 | sort > ~/local-list.txt
$ cd <remote_folder>; find . -type d -maxdepth 1 | sort > ~/remote-list.txt
$ diff -u ~/remote-list.txt ~/local-list.txt
    
por 26.02.2018 / 13:42