copia arquivos remotamente no mesmo caminho

1

Eu tenho milhares de arquivos csv em alguns diretórios. Dos quais eu gostaria de copiar um arquivo csv para a máquina remota no mesmo caminho, se a máquina remota não tem diretório, então deve criar um diretório e copiá-lo para esse caminho.

Deixe-me elaborar com o exemplo, digamos que eu tenha o arquivo chamado foo.csv em alguns diretórios

test/
├── 201512
    └── foo.csv
    └── bar.csv
├── 201601
    └── foo.csv
    └── abc.csv 
├── 201602
    └── foo.csv
    └── xyz.csv
.
.
├── 201612
    └── foo.csv
    └── asd.csv

Eu gostaria de copiar foo.csv no mesmo caminho que eu tenho na máquina de origem para a máquina remota. Portanto, /test/201512/foo.csv deve ser copiado para o mesmo caminho /test/201512/ no remoto. Se a máquina remota não tiver esse caminho de diretório, deverá criá-lo. O rsync ou scp tem alguma utilidade para realizar isso?

( Nota : o conteúdo de foo.csv pode ser diferente em todos os diretórios)

    
por Rahul 09.11.2016 / 08:29

1 resposta

1

Configuração, feita na minha caixa Vagrant:

$ mkdir -p test/20{1512,16{01..12}}
$ for d in !$; do printf 'I am a csv file in %s\n' "$d" > "$d"/foo.csv; printf 'I am a different file; do not copy me!\n' > "$d"/abc.csv; done

Estrutura de diretórios após a configuração:

[vagrant@localhost ~]$ tree test
test
├── 201512
│   ├── abc.csv
│   └── foo.csv
├── 201601
│   ├── abc.csv
│   └── foo.csv
├── 201602
│   ├── abc.csv
│   └── foo.csv
├── 201603
│   ├── abc.csv
│   └── foo.csv
├── 201604
│   ├── abc.csv
│   └── foo.csv
├── 201605
│   ├── abc.csv
│   └── foo.csv
├── 201606
│   ├── abc.csv
│   └── foo.csv
├── 201607
│   ├── abc.csv
│   └── foo.csv
├── 201608
│   ├── abc.csv
│   └── foo.csv
├── 201609
│   ├── abc.csv
│   └── foo.csv
├── 201610
│   ├── abc.csv
│   └── foo.csv
├── 201611
│   ├── abc.csv
│   └── foo.csv
└── 201612
    ├── abc.csv
    └── foo.csv

13 directories, 26 files
[vagrant@localhost ~]$ cat test/201609/foo.csv 
I am a csv file in test/201609
[vagrant@localhost ~]$ 

Em seguida, da minha própria caixa (não da caixa vagabunda):

rsync -ame 'ssh -p 2222' -f '+ */' -f '+ foo.csv' -f '- *' [email protected]:/home/vagrant/test .

Resultado:

$ find test
test
test/201512
test/201512/foo.csv
test/201601
test/201601/foo.csv
test/201602
test/201602/foo.csv
test/201603
test/201603/foo.csv
test/201604
test/201604/foo.csv
test/201605
test/201605/foo.csv
test/201606
test/201606/foo.csv
test/201607
test/201607/foo.csv
test/201608
test/201608/foo.csv
test/201609
test/201609/foo.csv
test/201610
test/201610/foo.csv
test/201611
test/201611/foo.csv
test/201612
test/201612/foo.csv

Notas sobre as opções rsync :

Aqui está novamente o comando usado:

rsync -ame 'ssh -p 2222' -f '+ */' -f '+ foo.csv' -f '- *' [email protected]:/home/vagrant/test .

-a é a opção "arquivar", o que significa que o diretório é copiado de forma recursiva, as permissões são preservadas, etc.

-m significa que todos os diretórios vazios não serão copiados (por exemplo, se um dos diretórios de data estiver faltando foo.csv , não criaremos esse diretório).

-e 'ssh -p 2222' é apenas porque estou usando uma caixa Vagrant que possui SSH em uma porta diferente de 22; você pode omitir essa parte.

-f introduz regras de "filtro". Você pode incluir ou excluir arquivos. Os filtros que usei devem ser bastante autoexplicativos - mas para esclarecer o filtro '+ */' , precisamos incluir todos os diretórios para que os arquivos foo.csv sejam alcançados .

Leia mais sobre isso na página do manual em:

LESS='+/INCLUDE\/EXCLUDE PATTERN RULES' man rsync
    
por 09.11.2016 / 09:16