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

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

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

dir1 dir2 dir3 ... dir40

cada um dos quais contém vários arquivos numerados:

file1 file2 file3 ... file2530

Quero copiar apenas um intervalo selecionado de arquivos em cada diretório. Como os nomes dos arquivos são idênticos em cada diretório, desejo recriar a hierarquia de diretórios em minha máquina local. Mas como eu não querotodoarquivo, não posso simplesmente scp -rcopiar todos os arquivos do diretório.

Não consigo configurar uma conexão automatizada com chaves ssh na máquina remota, então 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 não quero apenas copiar tudo e excluir aqueles que não quero rme preparar a expansão.

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

Responder1

Você poderia 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 copiar. Por exemplo,

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

Isso excluiria nomes de arquivos file-40.outcom 2 caracteres de 40 a 99, e também file-33.outa 39, e também file-100.outou maiores. Execute o comando com a -nopção mostrada para coletar a lista de nomes que seriam transferidos e, se estiver ok, remova a opção de realmente fazer a cópia.

Observe rsyncque não oferece suporte a colchetes {}em seus padrões glob. Formas alternativas de especificar os arquivos a serem copiados dependem de quão exótico é o seu padrão de exclusão, mas um método infalível é usar -ne não excluir padrões para obter a lista completa de nomes, depois editar esta lista e fornecê-la como uma --files-fromlista de arquivos. Você também precisaria remover o dir*do destino remoto:

rsync -av --files-from=list  myremote: mylocaldir

informação relacionada