
Estoy intentando crear un archivo por lotes por primera vez. Esto será para descargar un archivo que se actualiza una vez por semana con una nueva ID. Este es el archivo por lotes que he creado hasta ahora:
@echo off
echo open SERVER> temp.txt
echo USERNAME>> temp.txt
echo PWD>> temp.txt
echo cd />> temp.txt
echo cd Events/_PPV_Barker>> temp.txt
echo binary>> temp.txt
echo get Barker*_480i.ts>> temp.txt
ftp -s:temp.txt
del temp.txt
Sé que cada vez que se carga un nuevo archivo en el servidor, el inicio del nombre del archivo será Barker
y el nombre del archivo terminará con 480i.ts
. Intenté * como se muestra arriba, pero no funciona. ¿Cómo puedo usar el comando if para obtener el archivo con una identificación única cada vez? ¿O hay alguna otra forma además del comando if?
Cualquier ayuda será apreciada.
Gracias
Keshav
Respuesta1
Si te entiendo bien, hay un archivo nuevo cada vez que accedes al servidor, pero no conoces los detalles de su nombre. Lo que no sé es si el archivo se elimina después de descargarlo o si tienes un número cada vez mayor de archivos y tienes que elegir el último.
En el caso más simple, solo hay un archivo, y aquí su solución es casi correcta: se necesita un cambio simple, reemplazarlo get
por mget
, cuando el comodín *
funcione:-
echo mget Barker*_480i.ts>> temp.txt
Si hay muchos archivos que coinciden con esta máscara de archivo, descargará una cantidad cada vez mayor de archivos en cada acceso. Una solución rápida y sucia es mantener los archivos en su directorio actual y hacerlos de solo lectura: obtendrá muchos errores, pero el nuevo archivo se descargará y no tendrá la sobrecarga de transferir los archivos que desea. he obtenido anteriormente.
Si tiene acceso completo al directorio remoto, puede eliminar, mover o cambiar el nombre del archivo descargado en el control remoto, de modo que cada vez tenga solo un archivo que coincida con la máscara del archivo.
Si no puede hacer ninguna de estas cosas, necesitará dos ftp
llamadas: la primera obtendrá una lista de directorios del control remoto, que luego comparará con su lista remota anterior, para que luego pueda identificar el nuevo archivo y cree una segunda ftp
llamada para recuperarlo. No será fácil escribir un archivo por lotes para hacer esto, pero es posible: hago cosas como esta cuando proceso archivos WebCam.
Respuesta2
Si está dispuesto a colocar su contraseña y nombre de usuario en el script (¡en texto sin formato!), entonces no debería importarle usarlos en la línea de comando.
Si conserva copias locales de los archivos antiguos después de descargarlos y no los cambia ni sus marcas de tiempo, puede eliminar toda la idea del archivo por lotes usandowget para Windowse incluya la --timestamping
opción. Eso comparará el tamaño y la marca de tiempo de los archivos locales con los archivos remotos, y solo descargará archivos remotos cuando alguno de ellos sea diferente o el archivo local no exista. Como beneficio adicional, si se perdió actualizaciones anteriores, descargará todos los archivos nuevos, no solo el más nuevo.
Su línea de comando se vería así:
`wget --ftp-user=<user> --ftp-password=<password> --timestamping ftp://example.com/Events/_PPV_Barker/Barker*_480i.ts`
Por supuesto, esto supone que tiene los privilegios adecuados para instalar wget y que conserva las copias anteriores localmente.
Respuesta3
intenta usar el:
mget
dominio. Lo busqué y dice obtener varios archivos.
Respuesta4
Otros programas/formas
El uso ftp
no es seguro.
La versión segura de ftp se llama ftps
,ftp seguro. Intenta usarlo en lugar de ftp
, si puedes.
Siempre es un buen ejercicio hacer tus propios scripts, pero es mejor utilizar las herramientas creadas para tal fin cuando existan. Como alternativas más acogedoras puedes utilizar.wget
(ver más abajo) que no requerirá la instalación remota de ningún otro servidor.
Como tiene acceso a la computadora remota si está instalada, puede usarrsync
también.
Si falla, intente usarlo scp -p
o sftp
aproveche la clave ssh [4] .
Si desea seguir con ftp
, use la mget
opción que copiará ciegamente todos los archivos del directorio, pero configure de antemano el modo de transferencia de archivos a binario con el binary
comando.
Wget
wget
- El descargador de red no interactivo [1,2] . Puedes usar:
wget -S -N "ftp://YourSite/Events/_PPV_Barker/Barker*_480i.ts"
La opción -N
es mantener marcas de tiempo y descargar sólo archivos más recientes que los locales. Es posible que
la cita "
sea necesaria para evitar la expansión del shell en Linux.
También funciona en Windows (por supuesto, con la versión de Windows del programa).
un mas completolínea de comandoen tu caso (y en una sola línea) debería ser:
wget -user=USERNAME -password=PASSWORD
-N "ftp://YourSite/Events/_PPV_Barker/Barker*_480i.ts"
Por supuesto, es más prudente evitar escribir la contraseña en sulínea de comandoo en scripts... simplemente puedes usar la opción autoexplicativa --ask-password
.
Una solución mejor en Linux es colocar la información necesaria en un archivo llamado .wgetrc
. Debería ser fácil encontrar el nombre equivalente en la documentación de Windows.
$ cat ~/.wgetrc ftp_user=UsernameOnTheRemoteFTP ftp_password=PasswordOnTheRemoteFTP http_user=UsernameOnTheRemoteHTTP http_password=PasswordOnTheRemoteHTTP
Puedes leer desde wget --help
o desde man wget
:
-N, --marca de tiempo No vuelva a recuperar archivos a menos que sean más nuevos que los locales.
-S, --respuesta-servidor respuesta del servidor de impresión.--usuario=usuario
--contraseña=contraseña
Especifique el nombre de usuario y la contraseña para la recuperación de archivos FTP y HTTP. Estos parámetros se pueden anular utilizando las opciones --ftp-user y --ftp-password para conexiones FTP y las opciones --http-user y --http-password para conexiones HTTP.