wget no obtiene el listado completo del directorio

wget no obtiene el listado completo del directorio

He buscado por todas partes y no he podido encontrar una respuesta a mi problema. No estoy seguro de si este es el foro adecuado, pero espero que alguien aquí pueda ayudar.

He estado usando wget (FTP) para hacer una copia de seguridad de mi sitio web en mi disco duro local, usando la opción espejo, sin problemas, hasta hace poco. Recientemente, un directorio que contiene imágenes alcanzó el límite, establecido por el servicio de alojamiento, de cuántos elementos pueden estar en una lista FTP. No tengo acceso SSL a la cuenta.

Puedo ejecutar un script en el servidor remoto y obtener una lista completa del directorio (ls) en un archivo y descargarlo en mi máquina local.

¿Es posible enviar este archivo a wget y hacer que refleje esos archivos en mi disco local, como lo hacía antes de alcanzar el límite de listado? Me gustaría que wget leyera la lista generada y verificara si hay archivos modificados y agregados. Estas son las preguntas para las que no he podido encontrar respuestas:

1) ¿Cuál sería el comando ls adecuado para generar la información necesaria? Actualmente, solo obtengo los nombres de archivos reales, pero estoy seguro de que se necesitan más.

2) ¿Wget con la opción mirror seguirá funcionando con un archivo de entrada, o simplemente descargará todos los archivos en el archivo de entrada sin verificar el estado modificado? No he encontrado absolutamente ninguna información sobre esta combinación, sólo sobre una u otra. No quiero realizar pruebas y terminar obteniendo una copia de seguridad completa del directorio: una pérdida de ancho de banda y de tiempo para extraer todos esos datos.

Respuesta1

Puedes hacer esto, el único problema es obtener un resultado deeseso es lo mismo en el control remoto y en su máquina local. Mi ls tiene una opción --estilo-tiempo=+%sque muestra la última hora de modificación del archivo en segundos desde la época, que debe coincidir en ambas máquinas. Supongo que solo desea hacer esto para un directorio; de lo contrario, findsería más apropiado si tuviera ese comando.

En el control remoto, haga ls en el directorio requerido en un archivo:

cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile

En la máquina local, copie el control remoto /tmp/listfilea local /tmp/listfiley luego use awkpara suprimir las primeras 4 columnas de salida y ordenar la lista de tamaño de archivo, fecha y nombre de archivo. (Supongo que es posible que tenga nombres de archivos con espacios, de ahí el extraño awk).

awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a

En el directorio reflejado obtenga el mismo listado:

cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b

Compare las dos listas ordenadas y elimine las líneas que son iguales comunicación. Elimine las columnas de tamaño y fecha (y, de paso, la pestaña al inicio de las líneas en /tmp/b, no en /tmp/a, y 2 espacios entre columnas) y elimine los nombres de archivos duplicados conúnico. (No es necesario volver a ordenar ya que las líneas duplicadas son adyacentes).

comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c

La lista en /tmp/c son todos los archivos que son nuevos, de diferente tamaño o marca de tiempo, o que han sido eliminados. Pase cada uno a wget para buscar (aún en el directorio apropiado).

while read file
do  rm -f "$file"
    wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c

Debes configurar tu espejo wget para que ya no busque este directorio.

Si puede hacerlo find ... -printf '%9s %T+ %p\n', podría utilizar este tipo de técnica, comenzando en la parte superior del directorio espejo, para realizar la duplicación usted mismo de manera efectiva.

información relacionada