Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Comprimir en Ksh

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Programación en General
Mensaje Jue Nov 01, 2007 10:36 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Comprimir en Ksh Responder citando

Saludos, Perleros. Tengo el siguiente código que me comprime un montón de archivos en 3 paquetes. Todo funciona bien, pero el problema llega los días 31. Ese día no hace el proceso. ¿Alguna idea de qué es lo que esté pasando?

Saludos.

bash:
#!/usr/bin/ksh

. $HOME/.profile

export COLECTORHOME=/export/home/colljvip/LatJitterLan_thread
export AYER=`date '+%y:%m:%d' | awk -F":" '{printf"20%2d%2d%2d\n",$1,$2,($3-1)}' | sed 's/ /0/g'`;
export AYER=$1

export prefix=pruebas_latencia

cd ${COLECTORHOME}/historico/data

echo ${AYER}0
gzip ${prefix}${AYER}0*
tar -cvf Tar_${AYER}0.tar  ${prefix}${AYER}0*
rm ${prefix}${AYER}0*

echo ${AYER}1
gzip ${prefix}${AYER}1*
tar -cvf Tar_${AYER}1.tar  ${prefix}${AYER}1*
rm ${prefix}${AYER}1*

echo ${AYER}2
gzip ${prefix}${AYER}2*
tar -cvf Tar_${AYER}2.tar  ${prefix}${AYER}2*
rm ${prefix}${AYER}2*

gzip *.tar

cd ${COLECTORHOME}/historico/sql
echo ${AYER}0
gzip ${prefix}${AYER}0*
tar -cvf Tar_${AYER}0.tar  ${prefix}${AYER}0*
rm ${prefix}${AYER}0*

echo ${AYER}1
gzip ${prefix}${AYER}1*
tar -cvf Tar_${AYER}1.tar  ${prefix}${AYER}1*
rm ${prefix}${AYER}1*

echo ${AYER}2
gzip ${prefix}${AYER}2*
tar -cvf Tar_${AYER}2.tar  ${prefix}${AYER}2*
rm ${prefix}${AYER}2*

gzip *.tar

echo termino
Sad
Mensaje Jue Nov 01, 2007 12:18 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
Responder citando

El problema está en el cálculo del día de ayer cuando es primero de mes:

bash:
date '+%y:%m:%d' | awk -F":" '{printf"20%2d%2d%2d\n",$1,$2,($3-1)}' | sed 's/ /0/g' # 20071100

Es decir, pone la cifra del día a 0.

Lo mejor es usar una versión moderna del comando date:
bash:
date -d yesterday  +'%Y%m%d' # 20071031


Esto es muy cómodo: con la palabra inglesa 'yesterday' no tenemos que preocuparnos de hacer cuentas de qué día puede ser. Y solo queda elegir un formato adecuado a la salida que esperamos.
Mensaje Jue Nov 01, 2007 1:14 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Excelente.

Solo me confunde esta parte:
bash:
| sed 's/ /0/g

con el yesterday, ¿no afectaría?

Entonces podría quedar así:
bash:
date -d yesterday  +'%Y%m%d' # 20071031  | awk -F":" '{printf"20%2d%2d%2d\n",$1,$2,($3-1)}' | sed 's/ /0/g'
Mensaje Jue Nov 01, 2007 1:46 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
Responder citando

Que no, que has entendido la sintaxis de ksh... que lo que empieza por '#' es un comentario... he puesto las fechas que salen en forma de comentario para que veas qué es lo que sale.

De la página de manual de ksh:
Código:
  Comments.
       A word beginning with # causes that word and all the following characters up to a new-line to be ignored.


Y sobre el 'sed': sobra. Con el comando date, vale.

Hay que leer un poquito más, ¿eh? Confused

Actualización: he editado tu mensaje anterior y he cambiado las etiquetas de código a la de sintasix bash, que es la más parecida a la de ksh. Como verás, el efecto del '#' es brutal: todo lo que sigue es un comentario, incluido el comando awk y el sed.
Mensaje Jue Nov 01, 2007 3:23 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Ok, así quedaría:

bash:
export AYER= `date -d yesterday '+%Y%m%d'| awk -F":" '{printf"20%2d%2d%2d\n",$1,$2,($3-1)}' | sed 's/ /0/g'`;


Pero me manda un Warning.

Código:
date: illegal option -- d                                                                                               
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

Confused
Esto era lo que no comprendía, error mio no era el # si no esta parte, creo que no me supe dar a entender...
Comentario: No jalan, por la versión, rayos

Se supone que AYER va a ser igual al día de ayer, por lo tanto si yo a AYER le pongo igual a 20071031, ¿esa es la fecha que tomaría, verdad?
Mensaje Jue Nov 01, 2007 4:11 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
Responder citando

Con lo fácil que es hacerlo en Perl... Smile

Perl:
use POSIX;
$AYER = strftime("%Y%m%d", localtime(time - 86400));
Mensaje Jue Nov 01, 2007 4:22 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Sabes voy a proponer, una carita que esté llorando para poder insertarla en el foro... jajajajajaja Para qué me la complico, un programa en Perl y vámonos... Ok, deja, checo cuáles son los módulos para comprimir...
Wink
Mensaje Jue Nov 01, 2007 5:22 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Una pregunta rápida, para solucionar el problema en lo que armo el script en Perl.
Quiero comprimir X número de archivos (más de 5 mil) que comienzan con:
Código:
pruebas_latencia200710310000000.sql.gz

Los 000000 son datos. Según yo, un comodín para suplir esos ceros, es (*) y que todo eso me lo guarde en un archivo que diga Tar_200710310.tar y así segmentarlo en 3 bloques: 0,1,2.

Código:
gzip pruebas_latencia200710310* tar -cvf Tar_200710310.tar
gzip pruebas_latencia200710311* tar -cvf Tar_200710312.tar
gzip pruebas_latencia200710312* tar -cvf Tar_200710312.tar


Pero me manda el mensaje:
Código:
bash: /bin/gzip: Listado de argumentos demasiado largo


¿Qué me recomiendan hacer en estos casos?
Mensaje Jue Nov 01, 2007 5:34 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4143
Ubicación: Valladolid, España
Responder citando

El error del shell se debe a que por efecto del comodín, ha intentado poner miles de ficheros en la línea de comandos ANTES de ejecutar gzip.

En esos casos es mejor usar un bucle.

Otra cosa... en las versiones modernas de tar se puede hacer que comprima en gzip mientras va añadiendo ficheros. Así que
Código:
gzip pruebas_latencia200710310* tar -cvf Tar_200710310.tar
se puede convertir en
Código:
tar czvf Tar_200710310.tgz pruebas_latencia200710310*
Mensaje Jue Nov 01, 2007 6:22 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

mm No, de plano no jaló. Por cierto, mencioné que los archivos que quiero comprimir están ya comprimidos, jajajajajaja qué show, bueno habrá que hacerlo en Perl.

¿Qué me recomiendan, para que al final el archivo diga, archivo.tar.gz?

Saludos
Mensaje Jue Nov 01, 2007 7:40 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
Responder citando

explorer escribió:
El error del shell se debe a que por efecto del comodín, ha intentado poner miles de ficheros en la línea de comandos ANTES de ejecutar gzip.

En esos casos es mejor usar un bucle.

Otra cosa... en las versiones modernas de tar se puede hacer que comprima en gzip mientras va añadiendo ficheros. Así que
Código:
gzip pruebas_latencia200710310* tar -cvf Tar_200710310.tar
se puede convertir en
Código:
tar czvf Tar_200710310.tgz pruebas_latencia200710310*

En efecto, yo no soy el mejor en Shell pero si se de un "hack", usar for:

bash:
for X in $( ls ); do
    tar -xvzf ${X}
done


Para poder usar ksh hay que saber mucho sobre comandos (funciones de find, ls... que te pueden hacer la vida fácil) no sé cual es el indicado.

Lo de date (-d yesterday) depende, si estas en GNU o no.
BSD no soporta ese flag (creo que SunOS/Solaris tampoco, no lo he intentado) pero de pronto se puede hacer con algún comando (¿cal?).
En fin, en Perl puede ser más simple y portable.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Programación en General Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group