Tenho que mover alguns arquivos/diretórios de um diretório que era compartilhado por várias pessoas para outro computador. Os elementos que tenho que mover são alguns diretórios, alguns subdiretórios, alguns arquivos específicos em subdiretórios, etc... É uma pequena bagunça ^^
Estou tentando aplicar o método em https://serverfault.com/a/788007/154366, mas falha de alguma forma.
Aqui está minha configuração de teste (tentei torná-la representativa o suficiente para que eu pudesse entender a maioria dos detalhes, rsync --filter=merge
para que eu pudesse aplicá-la ao meu problema real):
#!/bin/bash
mkdir -p /tmp/test/{a/b,b/{a,b},c,.d}
touch /tmp/test/{f.txt,.f.txt,{a/b,b,b/{a,b},c,.d}/f.txt,b/.f.txt}
tree -a /tmp/test
/tmp/test
├── a
│ └── b
│ └── f.txt
├── b
│ ├── a
│ │ └── f.txt
│ ├── b
│ │ └── f.txt
│ ├── .f.txt
│ └── f.txt
├── c
│ └── f.txt
├── .d
│ └── f.txt
├── .f.txt
└── f.txt
Agora eu gostaria de usar um único rsync -av
comando para copiar os seguintes itens de /tmp/test
para /tmp/filt
:
- o
./a
diretório completo - o
./b/b
diretório completo - todos os arquivos e dotfiles filhos diretos do
./b
diretório - todos os arquivos (não dotfiles) filhos diretos do
./
diretório
Minhas "cópias" esperadas estão marcadas =>
aqui:
/tmp/test/ => /tmp/filt/
/tmp/test/a/ => /tmp/filt/a/
/tmp/test/a/b/ => /tmp/filt/a/b/
/tmp/test/a/b/f.txt => /tmp/filt/a/b/f.txt
/tmp/test/b/ => /tmp/filt/b/
/tmp/test/b/a/
/tmp/test/b/a/f.txt
/tmp/test/b/b/ => /tmp/filt/b/b/
/tmp/test/b/b/f.txt => /tmp/filt/b/b/f.txt
/tmp/test/b/f.txt => /tmp/filt/b/f.txt
/tmp/test/b/.f.txt => /tmp/filt/b/.f.txt
/tmp/test/c/
/tmp/test/c/f.txt
/tmp/test/.d/
/tmp/test/.d/f.txt
/tmp/test/f.txt => /tmp/filt/f.txt
/tmp/test/.f.txt
Então escrevi o seguinte filter.txt
arquivo para usá-lo com rsync's --filter=merge
:
+ /[!.]*
+ /a/
+ /a/**
+ /b/
+ /b/b/
+ /b/b/**
- /b/*/
+ /b/*
- /**
Mas quando executo o comando:
rsync -av --dry-run --filter='merge filter.txt' /tmp/test /tmp/filt/
Eu entendo:
sending incremental file list
test/
sent 74 bytes received 20 bytes 188.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
nota: é claro que o /tmp/filt
diretório não existe, então a falta de saída não está relacionada a ele.
O que estou fazendo errado?
Você precisa ter cuidado com a diferença entre um diretório de origem terminando com
/
ou não. A resposta de exemplo a que você se refere tem uma barra final. Se você fizer o mesmo, deve funcionar:Os padrões de filtro não estão funcionando, pois são comparados com arquivos
test/a/
como/a/
.Para evitar copiar o diretório
c
, você pode remover a primeira e a última linha das regras de filtro e adicionar, por exemplo, no final, 3 regras para excluir arquivos e diretórios dot de nível superior, mas incluir outros arquivos.O
+ /b/b/
e+ /b/b/**
pode ser recolhido em+ /b/b/***
.