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

1

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

    
por drjrm3 04.05.2015 / 22:09

3 respostas

0

Como você não especificou isso na pergunta, presumo que a estrutura do diretório seja remota e você a queira local.

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

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

A parte importante é a barra invertida, pois isso faz com que o seu shell local ignore o asterisco e o transmita. Isso deve permitir que você puxe todos os files* do remoto, incluindo os subdiretórios. Ele também extrairá os arquivos reais cujo nome começa com files* .

    
por 04.05.2015 / 22:20
0
Primeiro você tem que considerar o que você quer que aconteça com os arquivos que são copiados desta maneira, e como isso pode afetar futuras operações de cópia. Eles vão ficar lá? Eles serão deletados? Arquivado Depois de saber isso, você pode 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 os exclui do servidor remoto.

Existe o risco de os arquivos serem alterados entre operações de cópia e exclusão, portanto, primeiro os movo para um diretório temporário, depois copio e deleto-os, permitindo que o diretório de trabalho continue a operação regular.

Eu também criaria uma tarefa cron para recuperar esses arquivos automaticamente no mesmo horário todos os dias e adicionar algumas verificações de integridade para garantir que as operações sejam 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
    
por 04.05.2015 / 22:58
0
ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • ssh se conecta a uma máquina remota e executa código entre aspas duplas ""
  • find pesquisa dentro do diretório /target/A1 para todos os arquivos que contêm a palavra-chave "arquivos". Observe que você precisa das barras invertidas para o parâmetro de procura insensível a maiúsculas -iname e as aspas duplas para evitar deixar o par anterior muito cedo.
  • -exec é outro parâmetro find , usado para executar o código. No nosso caso, executamos scp e passamos todos os resultados da pesquisa de find para scp com os colchetes curvos {} .
  • scp copia 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 uma senha.

    
por 04.05.2015 / 22:46

Tags