Como posso comparar rapidamente dois diretórios ignorando arquivos vinculados que existem em ambos os diretórios no linux

1

Eu tenho dois diretórios que gostaria de comparar. O primeiro diretório contém um backup rsync de muitos milhares de pastas e arquivos. O segundo diretório contém links para todos os arquivos do primeiro, além de algumas pastas e arquivos adicionais. Eu gostaria de ser capaz de comparar os diretórios de tal forma que os arquivos com link físico são ignorados ou pelo menos rapidamente decidiram ser o mesmo arquivo e apenas os arquivos que não são hardlinks são ainda mais comparados. Isso é algo que o diff pode fazer, ou existe uma maneira melhor?

    
por decuser 22.02.2015 / 15:35

2 respostas

1

cmpdir é para este problema (Isenção de responsabilidade - eu escrevi).

Compara apenas inodes. Arquivos que existem apenas no primeiro diretório são marcados como "Removido", enquanto arquivos que existem apenas no segundo diretório como "Novo". Ele não compara o conteúdo do arquivo.

    
por 20.04.2016 / 03:55
0
  1. Você pode mostrar inodes de seus arquivos com ls -i -1 (-1 / "one" escreve uma linha por arquivo para saída).

  2. Salve a saída para cada uma das duas pastas.

  3. Se o nome do arquivo "original" e hardlinked for diferente, use cut -f1 para filtrar os nomes dos arquivos e reter apenas os números de inode.

  4. Classifique os arquivos para o número de inode usando sort . Agora você pode usar diff para ver as diferenças.

  5. Use grep "^<" diffOutput.list para filtrar as linhas que começam com < = > Inodes ocorrendo apenas na primeira pasta. grep "^>" análogo para a Pasta B. Use cut -c2- para excluir o primeiro caractere ( < ou > ) da saída se você precisar do número de inode.

Se você já removeu os nomes dos arquivos dos arquivos, terá que procurar os nomes dos arquivos por um determinado número de inode.

Salve a saída de ls -l -1 (com nomes de arquivos) para cada pasta em um arquivo. Agora você pode usar grep para obter os nomes de arquivos para os números de inode em um loop bash:

Seja InodesFilenamesA.list o arquivo contendo números de inode e nomes de arquivos para a pasta A

12345 file1inBothFolders
99999 file2OnlyInFolderA
88888 file3OnlyInFolderA
...

Deixar inodesA.list ser um arquivo contendo Inodes que ocorrem apenas na pasta A

99999
88888
....

Agora faça um loop sobre inodesA.list .

cat inodesA.list | while read line; do
    grep "$line" InodesFilenamesA.list
done

Você recebe uma lista de pastas

    
por 22.02.2015 / 21:01