-
Dudas en bash script
buenas, estoy haciendo un script para que copie un fichero de una maquina (mediante scp), el problema viene cuando el archivo no siempre es el mismo, sino que... por ejemplo el fichero1.bd llega a 2gb y pasa a fichero2.bd, el cual se ira llenando hasta llegar a 2gb y asi sucesivamente
yo tengo que desde el script entrar por ssh al servidor, hacer un bucle que lea el ultimo digito del fichero
y compare cada 1 con su tamaño, cuando el tamaño sea 0, resta 1 a $num y lo guarda para que el scp lo use para copiar
yo hice esto:
Código:
num=0
archivo=0
#lee el tamaño del fichero
archivo=`du -s /home/ancabi/f$num.txt | awk '{print $1}'`
while [ $archivo=0 ]; do
#incrementa 1 a num
let num=$num+1
archivo=`du -s /home/ancabi/f$num.txt | awk '{print $1}'`
done
echo $archivo
echo $num
cuando lo ejecuto lo hace bien pero claro, antes de llegar al done, el du busca f3.txt y no lo encuentra, pasa a f4.txt y no lo encuentra y se crea un bucle infinito que incrementa num y no encuentra el fichero
pero f2.txt el tamaño es 0, por lo cual el while deberia de para pero no lo hace
intente explicarme lo mejor posible
saludos
-
Lo que necesitas es comprobar que el archivo existe. Con test puedes hacerlo.
A ver, si lo he entendido bien, dados los archivos:
Cita:
$ ls .
f1.db f2.db f3.db
y siendo sus tamaños
Código:
$ du -s *
4 f1.txt
4 f2.txt
0 f3.txt
lo que quieres es copiar f2.txt ?
Salu2
-
Bueno, pues supongo que es eso lo que quieres hacer. Así que, suponiendo que tienes acceso por ssh a ambos hosts:
Código:
echo '
num=0
while [ -r \'f\'$((++num))\'.db\' ]; do
if [[ `du \'f\'$num\'.db\'|cut -f1` == 0 ]]; then
archivo=\'f\'$((--num))\'.db\'
break
fi
done
scp $archivo yo@maquina_uno:/destino
' > checker.sh
chmod +x checker.sh
scp checker yo@maquina_dos:/directorio/con/los/archivos
ssh yo@maquina_uno /directorio/con/los/archivos/checker.sh
Por supuesto no está probado :p
Salu2
-
no me habria salido nunca, efectivamente quiero copiar f2.txt, asiq me imagino que estara bien con el unico problema de que la maquina que tiene los archivos es un windows, por lo tanto el checker.sh no lo puedo copiar alla para ejecutarlo no? deberia hacerlo en el batch de windows o hay alguna forma de que desde mi linux lo pueda ir ejecutando? es en LAN asiq velocidad hay...
lo siento por ese detalle que me olvide
Saludos
-
al final lo hice con comando del DOS y tambien lo encare de otra manera, en vez de leer el nombre comparar el tamaño y demas, lo que hace es copiar a otra carpeta los archivos modificados ese mismo dia, por lo tanto los que ya estan completos no los copia, sino el que se va llenando y arregla el problema de que si uno en el medio del dia y empieza uno nuevo...
para que sea automatico puse %DATE% asi solo pide la fecha de cada dia, lo comprime, el bzip2 solo borra el source por lo tanto en la carpeta solo queda lo comprimido, copia por ssh al servidor y borra la carpeta, aca dejo el codigo por si sirve de algo
Código:
xcopy c:\origen\* c:\destino /d:%DATE% /y
bzip2 c:\destino\*
scp -P 8100 /cygdrive/c/destino/* [email protected]:/home/copia
del c:\destino\* /q
saludos