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:

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

Richard Rodriguez
fonte

Respostas:

12

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

$ dir="~"
$ server="[email protected]"
$ 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)

Bernhard
fonte
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

slm
fonte
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
DRAD
fonte