restic version
restic 0.9.6 (v0.9.6-0-gb723ca3d) compilado com go1.10.4 no linux / amd64
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.
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).
A pasta $RECYCLE.BIN
é excluída do backup quando adicionada a um arquivo de exclusão.
A pasta $RECYCLE.BIN
está incluída no backup, embora seja adicionada a um arquivo de exclusão.
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.
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).
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.
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.
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.