Copie seletivamente de uma coleção de diretórios remotos

1

Eu tenho uma máquina remota com um grande número de diretórios numerados, assim:

dir1 dir2 dir3 ... dir40

cada um contendo vários arquivos numerados:

file1 file2 file3 ... file2530

Eu quero copiar apenas um intervalo selecionado dos arquivos em cada diretório. Como os nomes dos arquivos são idênticos em cada diretório, quero recriar a hierarquia de diretórios em minha máquina local. Mas como não quero todos os arquivos , não posso usar apenas scp -r para copiar todos os arquivos no diretório.

Não consigo configurar uma conexão automatizada com chaves ssh na máquina remota, portanto, prefiro um método que não envolva chamadas repetidas para um comando de cópia remota. Os arquivos também são grandes, então eu não quero simplesmente copiar tudo e deletar os que eu não quero com rm e brace expansion.

Como posso copiar um conjunto de arquivos de uma máquina remota, juntamente com os diretórios-pai desses arquivos, preservando a estrutura de diretórios e sem copiar todos os arquivos nesses diretórios?

    
por Dan 31.05.2017 / 23:08

1 resposta

2

Você pode usar rsync , que fará apenas um ssh para o controle remoto, e fornecerá uma lista completa de arquivos ou uma lista de padrões glob de arquivos para copiar ou não. Por exemplo,

rsync -navR --exclude='*-[4-9]?.out' --exclude='*-3[3-9].out' --exclude='*-???*.out' myremote:'dir*' mylocaldir

Isso excluiria nomes de arquivos como file-40.out com 2 caracteres de 40 a 99 e também file-33.out a 39 e também file-100.out ou maior. Execute o comando com a opção -n como mostrado para coletar a lista de nomes que seriam transferidos e, se isso for correto, remova a opção de fazer a cópia.

Note que rsync não suporta chaves {} em seus padrões glob. Formas alternativas de especificar os arquivos a serem copiados dependem de quão exótico é seu padrão de exclusão, mas um método infalível é usar -n e nenhum padrão de exclusão para obter a lista completa de nomes, editá-la e fornecê-la como --files-from lista de arquivos. Você também precisaria remover o dir* do destino remoto:

rsync -av --files-from=list  myremote: mylocaldir
    
por 01.06.2017 / 13:35