
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 -r
copiar 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 rm
e 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.out
com 2 caracteres de 40 a 99, e também file-33.out
a 39, e também file-100.out
ou maiores. Execute o comando com a -n
opçã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 rsync
que 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 -n
e não excluir padrões para obter a lista completa de nomes, depois editar esta lista e fornecê-la como uma --files-from
lista de arquivos. Você também precisaria remover o dir*
do destino remoto:
rsync -av --files-from=list myremote: mylocaldir