AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 768308
Accepted
windfish
windfish
Asked: 2024-02-02 20:39:25 +0800 CST2024-02-02 20:39:25 +0800 CST 2024-02-02 20:39:25 +0800 CST

espelhar uma árvore de diretórios por links físicos para conteúdo de arquivos e links simbólicos para estrutura de diretórios

  • 772

qual é a melhor maneira de espelhar um diretório inteiro, digamos original/, para um novo diretório, digamos mirror/, que tem a estrutura mirror/data/e mirror/tree/, de modo que

  • cada arquivo no diretório original/ou em qualquer um de seus subdiretórios está vinculado a um arquivo emmirror/data
    • cujo nome de arquivo é um identificador exclusivo de seu conteúdo, digamos, um hash de seu conteúdo, e
    • que é vinculado simbolicamente a partir de um ponto mirror/treecujo caminho relativo corresponde ao caminho relativo do arquivo original em original,

tal que possa ser facilmente restaurado?

esse recurso talvez seja implementado por alguma ferramenta existente? – aquele que permite escolher com flexibilidade o comando para criar um identificador único para um arquivo pelo seu conteúdo.


por exemplo, digamos que haja apenas um arquivo original/something, que é um arquivo de texto contendo a palavra “dados”. então eu quero executar um script ou comando original, de modo que o resultado seja:

$  tree original mirror
original
└── something
mirror
├── data
│   └── 6667b2d1aab6a00caa5aee5af8…
└── tree
    └── original
        └── something -> ../../data/6667b2d1aab6a00caa5aee5af8…

5 directories, 3 files

aqui, o arquivo 667b…é um link físico original/somethinge seu nome de arquivo é hash sha256sum desse arquivo. observe que abreviei o nome do arquivo para maior legibilidade.

quero poder restaurar perfeitamente o original pelo seu espelho.

eu sei que posso escrever um script para fazer isso, mas antes de fazer isso e talvez cometer um erro e perder alguns dados, quero saber se existe alguma ferramenta por aí que já implemente isso com segurança (não encontrei nenhuma, então longe) ou se houver alguma armadilha.

background : quero manter um arquivo de um diretório que rastreia renomeações, mas não preciso de controle de versão. eu sei que git-annexisso pode ser feito com muita sobrecarga usando repositórios git, mas eu só preciso espelhar o conteúdo de um diretório usando links simbólicos para a estrutura de diretórios para arquivos cujos nomes de arquivos são hashes de seu conteúdo. então eu poderia usar o git-diff para rastrear renomeações. não entendo completamente o que o git-annex está fazendo, então não quero confiar nele para arquivar meus dados. então estou procurando uma alternativa mais leve e menos intrusiva.

backup
  • 1 1 respostas
  • 30 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2024-02-02T23:26:24+08:002024-02-02T23:26:24+08:00

    Não é tão difícil de implementar. Em um sistema GNU (para ln -re sha1sum -z) e com zsh:

    mkdir -p mirror/{data,tree} &&
      find original -type f -exec sha1sum -z {} + |
        while IFS= read -rd '' rec; do
          sum=$rec[1,40] file=$rec[43,-1]
          ln -f -- $file mirror/data/$sum &&
            mkdir -p -- mirror/tree/${${file#*/}:h} &&
            ln -rs mirror/data/$sum mirror/tree/${file#*/}
        done
    

    Observe que ele não tenta preservar metadados (propriedade, permissão, mtime/atime, ACLs, atributos estendidos) de diretórios. E se vários arquivos tiverem o mesmo conteúdo, qual deles acabará vinculado mirror/dataserá mais ou menos aleatório, pois dependerá da ordem em que findos reporta, o que não é determinístico.

    Observe também que diretórios vazios e arquivos que não são diretórios nem regulares (como links simbólicos, fifos, dispositivos...) não serão copiados.

    Copiar a estrutura de diretórios incluindo arquivos especiais e com o máximo de metadados possível pode ser feito usando GNU tar:

    set -o pipefail
    mkdir -p mirror/{data,tree} &&
      (
        cd original && find . ! -type f -print0 |
          tar -cf - --xattrs --null --verbatim-files-from --no-recursion -T -
      ) | (
        cd mirror/tree && tar -xpf - --xattrs
      ) &&
      find original -type f -exec sha1sum -z {} + |
        while IFS= read -rd '' rec; do
          sum=$rec[1,40] file=$rec[43,-1]
          ln -f -- $file mirror/data/$sum &&
            ln -rs mirror/data/$sum mirror/tree/${file#*/}
        done
    

    Porém, esteja ciente de que a criação desses links simbólicos nesses diretórios atualizará o horário da última modificação.

    • 1

relate perguntas

  • rsync ignora algumas pastas em /mnt sem motivos

  • Como fazer um backup incremental e pesquisável completo de todo o disco rígido e tabela de partições?

  • comando pax para backup incremental com links físicos semelhantes ao rsync

  • Como organizar seu sistema para vários projetos? [fechado]

  • Posso salvar o instantâneo do timeshift na caixa de depósito?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve