¿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.