¿Cómo descargar el último archivo en una carpeta usando un scp?


10

Me gustaría ejecutar una transferencia scp para descargar el último archivo (el más nuevo) en un directorio determinado a mi directorio local.

Algo como esto:

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

Al obtener solo el archivo más nuevo, no todos, en backups.

Respuestas:


12

Supongamos que tiene variables servery dirdefinidas, puede hacer

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

Donde primero busca el archivo más nuevo y luego lo copia.

Nota: No lo verifiqué para ver si era infalible (por ejemplo, la última entrada es una carpeta)


Si es un directorio que no scp nada. Necesitas usar scp -r.
slm

@slm Correcto, pero es posible que no quiera copiar eso.
Bernhard

Si scpse interrumpe el proceso, tendrá que reiniciar la copia desde el principio, rsyncpuede reanudar desde donde lo dejó.
slm

Para bash, necesitaba reemplazar las comillas simples con comillas dobles en el argumento a ssh.
Johannes Bittner

1
Puede eliminar el primer $ dir haciendo lo siguiente (agregado /*a al final del segundo $ dir):scp $server:$(ssh $server 'ls -t $dir/* | head -1') .
Jesse

1

scpes tonto en el sentido de que solo copia ciegamente archivos de origen a destino. Si desea algo más inteligente sobre la copia de archivos, deberá utilizar una herramienta como rsync.

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

Esto solo copiará los archivos que faltan o han cambiado del directorio de copias de seguridad de rimmer.sk en el último día (-ctime -1) al directorio de su copia de seguridad 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.

Referencias


El problema con rsync es el mismo. Si he estado fuera de línea durante 2 días, intenta copiar todas las copias de seguridad de todos los días, lo cual no necesito en absoluto y es enorme.
Richard Rodriguez

@RichardRodriguez - OK, actualice su pregunta y sea más específico sobre lo que busca.
slm

2
@slm: Creo que la pregunta está bien como está. Solo quiero descargar el último archivo en un directorio. ¿Qué más puedo explicar al respecto? :)
Richard Rodriguez

@RichardRodriguez: ¿qué archivos hay en este directorio? Un listado de muestra sería útil.
slm

1
¿Por qué el voto negativo?
slm

0

Un poco tarde para la fiesta, pero tal vez una solución con ssh y rsync funcione para algunos:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.