Como baixar o arquivo mais recente em uma pasta usando um scp?


10

Gostaria de executar uma transferência scp para baixar o arquivo (mais recente) mais recente em um determinado diretório para o meu diretório local.

Algo assim:

  • fonte :root@rimmer.sk:/home/rimmer/backups/
  • destino :/home/rimmer/backups/

Ao obter apenas o arquivo mais recente, nem todos, no backups.

Respostas:


12

Suponha que você tenha variáveis servere dirdefinido, você pode fazer

$ dir="~"
$ server="user@server.com"
$ scp $server:$dir/$(ssh $server 'ls -t $dir | head -1') .

Onde você primeiro procura o arquivo mais recente e depois o copia.

Nota: Não verifiquei se não havia falhas (por exemplo, a última entrada sendo uma pasta)


Se é um diretório que não irá scp nada. Você precisa usar scp -r.
slm

@ Slm Correto, mas ele pode não querer copiar isso.
Bernhard

Se o scpget for interrompido, ele terá que reiniciar a cópia desde o início, rsyncpodendo continuar de onde parou.
slm

Para o bash, eu precisava substituir as aspas simples por aspas duplas no argumento to ssh.
Johannes Bittner

1
Você pode remover o primeiro $ dir fazendo o seguinte (adicionado /*a ao final do segundo $ dir):scp $server:$(ssh $server 'ls -t $dir/* | head -1') .
Jesse

1

scpé burro no sentido de que apenas copia cegamente os arquivos da origem ao destino. Se você quiser algo mais inteligente sobre como copiar arquivos, precisará usar uma ferramenta como rsync.

$ rsync -avz root@rimmer.sk:'$(find /home/rimmer/backups/ -ctime -1)' /home/rimmer/backups/

Isso copiará apenas os arquivos ausentes ou que foram alterados do diretório de backups do rimmer.sk no último dia (-ctime -1) para o diretório do backup local.

-ctime n
   File's  status  was last changed n*24 hours ago.  See the comments for 
   -atime to understand how rounding affects the interpretation of file 
   status change times.

Referências


O problema com o rsync é o mesmo. Se eu estiver offline por 2 dias, ele tentará copiar todos os backups de todos os dias, o que eu não preciso e é enorme.
Richard Rodriguez

@RichardRodriguez - OK, atualize sua pergunta e seja mais específico sobre o que procura.
slm

2
@ SLM: Eu acho que a questão está bem como está. Eu só quero baixar o arquivo mais recente em um diretório. O que mais posso explicar sobre isso? :)
Richard Rodriguez

@RichardRodriguez - que arquivos estão neste diretório? Uma listagem de amostra seria útil.
Slm

1
Por que o voto negativo?
slm

0

Um pouco atrasado para a festa, mas talvez uma solução com ssh e rsync funcione para alguns:

source_host="yourhost.com"
source_dir="/a/dir/on/yourhost.com/"
target_dir="/the/dir/where/last_backup/will/be/placed"
last_backup=$(ssh user@${source_host} "ls -t ${source_dir} | head -1")
if [ "${last_backup}" == "" ]; then
    echo "ERROR: didn't find a backup, cannot continue!"
else
    echo "the last backup is: ${last_backup}"
    rsync -avzh user@${source_host}:${source_dir}/${last_backup} ${target_dir}
fi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.