Diff: nomes de arquivos ligeiramente diferentes, mesmo arquivo

0

Estou usando diff -rq para comparar diretórios em um servidor Mac OS X 10.6. Na pasta1, temos 'nome do arquivo'. Na pasta2, temos 'nome_do_arquivo.arquivo' porque a pasta2 é criada por um aplicativo de sincronização de arquivos que também arquiva os arquivos sincronizados.

Acabamos de puxar a pasta1 de um backup e quero ver o que, na pasta2, é mais recente e pode ser copiado.

Como eu faria isso? Especificamente, estou perguntando como fazer o diff de tal forma que 'file' seja avaliado como 'file.archive', e de preferência pelo conteúdo do arquivo ou checksum, e não pelo filename.

    
por Harv 11.11.2014 / 19:22

1 resposta

1

Você não pode fazer isso com "apenas" diff , pois os nomes dos arquivos não coincidem em ambos os diretórios e o diff não tem nada construído para fazer o mapeamento.

O que você pode fazer é mudar para o diretório "novo" e fazer:

for i in *; do diff "$i" /path/to/other/dir/"$i"; done

ou altere para o diretório de backup restaurado e faça:

for i in *.archive; do diff "$i" /path/to/new/dir/"${i%.archive}"; done

Se isso se estender a toda a estrutura de diretórios, isso se tornará um pouco mais complexo. Se os originais estiverem abaixo de a e o backup for restaurado temporariamente em backup/b :

.
├── a
│   ├── p
│   │   ├── x
│   │   ├── y
│   │   └── z
│   └── q
│       ├── 1
│       ├── 2
│       └── 3
└── backup
    └── b
        ├── p
        │   ├── x.archive
        │   ├── y.archive
        │   └── z.archive
        └── q
            ├── 1.archive
            ├── 2.archive
            └── 3.archive

Você pode executar o seguinte script com python toddiff.py a backup/b > todiff (o todiff não está listado na estrutura de árvore acima).

import sys
import os

base = sys.argv[1]
if base[-1] != '/':
    base += '/'  # this last / needs to be removed to create bup_file_name
backup = sys.argv[2]

for root, directory_names, file_names in os.walk(base):
    for file_name in file_names:
        full_name = os.path.join(root, file_name)
        bup_file_name = os.path.join(backup, full_name.replace(base, '', 1))
        bup_file_name += '.archive'
        # adjust the diff options to your need in the following line
        print('diff -u "{}" "{}"'.format(full_name, bup_file_name))

Isso gerará um arquivo do formulário:

diff -u "a/q/3" "backup/b/q/3.archive"
diff -u "a/q/1" "backup/b/q/1.archive"
diff -u "a/q/2" "backup/b/q/2.archive"
.
.

que você pode usar como fonte: source ./todiff

Nesse caso, sugiro que você execute o seguinte programa

    
por 11.11.2014 / 19:56