Usando scp para obter todos os arquivos em vários diretórios

Usando scp para obter todos os arquivos em vários diretórios

Eu tenho uma estrutura de diretórios que se parece com A1/B1/C1/files111*,,,, etc. para que todos os arquivos em todos os diretórios sejam exclusivos A1/B1/C2/files112*. Existe uma maneira de usar o scp (ou alguma outra ferramenta) para extrair todos os arquivos do terminal de uma vez?A1/B2/C1/files121*A1/B2/C2/files122*files###*

Responder1

Como você não especificou isso na pergunta, presumirei que a estrutura de diretórios é remota e você a deseja local.

O que você precisa fazer é usar curingas, mas escapar deles no lado do cliente, para que seu shell local os ignore e os transmita. Combine isso com um sinalizador recursivo ( -r) e ele deverá funcionar como você deseja:

scp -r remotemachine:some/directory/files\*   /some/local/target/directory/

A parte importante é a barra invertida, pois faz com que seu shell local ignore o asterisco e passe-o adiante. Isso deve permitir que você extraia tudo files*remotamente, incluindo subdiretórios. Ele também extrairá todos os arquivos reais cujo nome comece com files*.

Responder2

Primeiro você deve considerar o que deseja que aconteça com os arquivos copiados dessa maneira e como isso pode afetar futuras operações de cópia. Eles vão ficar lá? Eles serão excluídos? Arquivado? Depois de saber disso, você poderá criar seu comando de cópia e, em seguida, as operações de limpeza necessárias. Aqui está um exemplo de script que primeiro copia todos os arquivos existentes e depois os exclui do servidor remoto.

Há o risco de os arquivos mudarem entre as operações de cópia e exclusão, então eu primeiro os moveria para um diretório temporário, depois os copiaria e excluiria de lá, permitindo que o diretório de trabalho continuasse a operação normal.

Eu também criaria um cron job para recuperar esses arquivos automaticamente no mesmo horário todos os dias e adicionaria algumas verificações de integridade para garantir que as operações fossem concluídas com êxito.

#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"

for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@$HOST:$remoteTargets $localDir
    ssh -t user@$HOST 'rm -rf $remoteTargets'
done

Responder3

ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • sshconecta-se a uma máquina remota e executa código entre aspas duplas""
  • findprocura dentro do /target/A1diretório todos os arquivos que contenham a palavra-chave "arquivos". Observe que você precisa de barras invertidas para parâmetros de pesquisa que não diferenciam maiúsculas de minúsculas -inamee aspas duplas para evitar deixar o par anterior muito cedo.
  • -execé outro findparâmetro usado para executar código. No nosso caso, executamos scpe passamos todos os resultados da pesquisa de findpara scpcom colchetes curvos {}.
  • scpcopia seus arquivos encontrados para sua máquina local ou qualquer outra máquina.

Isso funcionou na minha configuração de teste, pois troquei as chaves públicas para usar a autenticação sem senha.

informação relacionada