Restic: excluir $ RECYCLE.BIN com um arquivo de exclusão não funciona

Criado em 31 mai. 2020  ·  4Comentários  ·  Fonte: restic/restic

Resultado de restic version

restic 0.9.6 (v0.9.6-0-gb723ca3d) compilado com go1.10.4 no linux / amd64

Como você executou o Restic exatamente?

Eu tenho uma partição NTFS compartilhada entre um dual-boot do Windows 10 e Ubuntu 18.04, que faço backup com o Restic do Ubuntu. Como você provavelmente sabe, o Windows 10 cria um diretório $RECYCLE.BIN no diretório raiz da partição para armazenar os arquivos que são movidos para a lixeira. Quero fazer backup da partição compartilhada, mas não do diretório $RECYCLE.BIN .

Mais abaixo, forneci uma descrição detalhada sobre como reproduzir o que estou observando. Resumindo: usar --exclude="\$RECYCLE.BIN" com o comando de backup não exclui o diretório, colocando "$ RECYCLE.BIN" (ou qualquer outra variante que eu possa criar, veja abaixo) em um --exclude-file não excluir o diretório.

Qual backend / servidor / serviço você usou para armazenar o repositório?

Observo o comportamento tanto com um repositório local (no Ubuntu 18.04) quanto com um repositório remoto via SFTP (backup executado também no Ubuntu 18.04).

Comportamento esperado

A pasta $RECYCLE.BIN é excluída do backup quando adicionada a um arquivo de exclusão.

Comportamento real

A pasta $RECYCLE.BIN está incluída no backup, embora seja adicionada a um arquivo de exclusão.

Passos para reproduzir o comportamento

Dentro de um diretório de teste temporário, emita os seguintes comandos em um bash:

# prepare the directory to be backed up
mkdir "data";
mkdir "data/\$RECYCLE.BIN";
touch "data/backup_this";
touch "data/\$RECYCLE.BIN"/ignore_this";

# init repo
mkdir "repo";
restic init --repo=repo/

# prepare exclude file
echo "\$RECYCLE.BIN" > exclude.file

Agora emitindo restic --repo=repo/ backup --verbose --verbose data/ rendimentos:

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 2 files, 0 B
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.004s (0 B added)
new       /data/backup_this, saved in 0.000s (0 B added)

Files:           2 new,     0 changed,     0 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      1 new
Added to the repo: 372 B

processed 2 files, 0 B in 0:00
snapshot 27c00c6b saved

como esperado.

Emissão de restic --repo=repo/ backup --verbose --verbose --exclude="\$RECYCLE.BIN" data/ rendimentos

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 27c00c6b
start scan on [data/]
start backup on [data/]
scan finished in 0.257s: 1 files, 0 B
unchanged /data/backup_this

Files:           0 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      1 new
Added to the repo: 372 B

processed 1 files, 0 B in 0:00
snapshot 61c27a16 saved

o que também é esperado.

No entanto, a emissão de restic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/ , onde

 $ cat exclude.file 
$RECYCLE.BIN

resulta em

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 61c27a16
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 2 files, 0 B
unchanged /data/backup_this
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.003s (0 B added)

Files:           1 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 2 files, 0 B in 0:00
snapshot 9a62470f saved

Ou seja, o diretório não é excluído do backup, embora esteja presente no arquivo de exclusão.

Também tentei diferentes variantes do arquivo de exclusão (escapando do cifrão, adicionando aspas, adicionando uma nova linha no final do arquivo), mas nada tornou difícil excluir o diretório.

Você tem alguma ideia do que pode ter causado isso?

Presumo que deve haver algum erro ao lidar com nomes de arquivo de um arquivo de exclusão que envolvem caracteres desagradáveis ​​(como o cifrão).

Você tem uma ideia de como resolver o problema?

Infelizmente, não tenho ideia sobre go (só sou fluente em C ++), mas deve haver algo errado na interação com o sistema operacional e / ou o sistema de arquivos ao lidar com nomes de arquivos incluindo caracteres estranhos.

O restic ajudou você hoje? Isso te fez feliz de alguma forma?

Eu uso o restic extensivamente para backups locais e remotos. Mantenha o bom trabalho!
Se eu puder ser de alguma ajuda adicional para resolver esse problema, me avise.

backup need feedback questioproblem

Todos 4 comentários

Não tenho certeza sobre --exclude , mas ao excluir arquivos, o restic expande as variáveis ​​de ambiente. Use $$RECYCLE.BIN para evitar isso.

Veja: https://restic.readthedocs.io/en/latest/040_backup.html#excluding -files

Bem, obrigado, parece que esqueci exatamente este único parágrafo na documentação.

Parece funcionar:

 $ cat exclude.file 
$$RECYCLE.BIN

e a emissão de restic --repo=repo/ backup --verbose --verbose --exclude-file=exclude.file data/ novamente produz

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 96bdd658
start scan on [data/]
start backup on [data/]
scan finished in 0.211s: 1 files, 0 B
unchanged /data/backup_this

Files:           0 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 1 files, 0 B in 0:00
snapshot 5c475b96 saved

como esperado.

No entanto, em mais de 10 anos de experiência em Linux, nunca encontrei a necessidade de escapar de $ por $$ vez de \$ , mas como afirma a documentação, isso parece ser o padrão por os.ExpandEnv , então isso não é específico para restic.

No entanto, restic --repo=repo/ backup --verbose --verbose --exclude="$$RECYCLE.BIN" data/ rende

open repository
enter password for repository: 
repository 837fc3f7 opened successfully, password is correct
lock repository
load index files
using parent snapshot 5c475b96
start scan on [data/]
start backup on [data/]
scan finished in 0.204s: 2 files, 0 B
new       /data/$RECYCLE.BIN/ignore_this, saved in 0.002s (0 B added)
unchanged /data/backup_this

Files:           1 new,     0 changed,     1 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      0 new
Added to the repo: 0 B  

processed 2 files, 0 B in 0:00
snapshot ed44b219 saved

o que parece ser bastante inconsistente e contra-intuitivo.

As aspas duplas em --exclude="$$RECYCLE.BIN" significam que o shell expande $$ para o PID atual. Experimente com aspas simples: --exclude='$$RECYCLE.BIN'

(Por exemplo, olhe para echo "$$RECYCLE.BIN" vs echo '$$RECYCLE.BIN' )

@kontakm Parece que o problema está resolvido para mim. Por favor, feche-o se for o caso.

Esta página foi útil?
0 / 5 - 0 avaliações