Substitua todos os arquivos por hash idêntico

2

Eu quero substituir todos os arquivos em um caminho de destino com o mesmo nome de original.file E o mesmo hash que orignal.file com new.file. Qual é o comando para fazer isso?

Digamos que atualizei o conteúdo de um arquivo e agora quero que todas as outras cópias desse arquivo em um determinado caminho também sejam atualizadas.

Na maioria dos casos, o código a seguir funcionaria:

find /target_path/ -iname "original.file" -exec cp new.file '{}' 

No entanto, se original.file for readme.txt, por exemplo, muitos arquivos não relacionados serão sobrescritos.

    
por svandragt 15.06.2011 / 13:37

2 respostas

3

Isso exigirá um teste para ver se as somas de verificação correspondem antes de decidir executar o cp , você terá que executar uma subshell como o argumento -exec a ser encontrado. Isso deve fazer o trabalho:

find /target_path/ -iname "original.file" -exec bash -c \
  '[[ $(md5sum "original.file") = $(md5sum "{}") ]] && cp "new.file" "{}"' \;
    
por 15.06.2011 / 13:48
0

Seria mais fácil para você fazer todas as cópias idênticas de links de arquivos. Uma maneira de fazer isso é com fdupes : executar fdupes -L . Em seguida, altere os arquivos no lugar; isso preservará os links físicos.

Se tudo o que você deseja fazer é encontrar um arquivo por nome e conteúdo ou por nome e hash, basta adicionar outra condição ao seu comando find .

find /target_path/ -iname "original.file" -exec cmp old.file {} -exec cp new.file {}
find /target_path/ -iname "original.file" \
                   -exec sh -c 'test "$(md5sum | sed "s/ .*//")" = "$1" <"$0"' {} "$(cat old.md5sum)" \
                   -exec cp new.file {}

Você não diz qual é o seu aplicativo; pode ou não ajudar a envolver uníssono , que can detectar arquivos idênticos em diferentes caminhos ao fazer sincronização remota .

    
por 15.06.2011 / 18:45