
Fondo:Es una medida temporal para cargar algunos datos de prueba en un entorno de prueba (una base de datos Sybase).
Tengo un montón de archivos que debo importar a la base de datos diariamente. Estos archivos están organizados como tal.
30Aug2011/IMPORT_ME.txt
31Aug2011/IMPORT_ME.txt
...
8Sep2011/IMPORT_ME.txt
9Sep2011/IMPORT_ME.txt
Después de cada importación, necesito ejecutar alguna declaración SQL especial para corregir la fecha. Esto es lo que hice en el guión principal.
import_file.sh 20Aug2011/IMPORT_ME.txt
cat rerun_import_file.tmpl | sed -e "s/XXX/8 Aug 2011/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
...
import_file.sh 9Sep2011/IMPORT_ME.txt
cat rerun_import_file.tmpl | sed -e "s/XXX/9 Sep 2011/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
Entonces supongo que puedo mejorarlo:
encontrar todos los directorios que se ajusten al patrón de fechas
ordenar las fechas correctamente (muy importante para la configuración)
analizar la fecha y establecer la fecha de acuerdo con el archivo sql
Sin embargo, mi bash script-fu no es lo suficientemente bueno para hacerlo.
Respuesta1
Por supuesto, me perdí la parte de clasificación de la pregunta. Para responder a eso, propongo un modelo diferente que es más simple en algunos aspectos:
ls */IMPORT_ME.txt | cut -d/ -f 1 | date --file=- +%s | sort -n | sed -e 's/^/@/' \
| while read DATE
do
FILENAME=`date -d ${DATE} +%-d%b%Y/IMPORT_ME.txt`
REPLACEMENT=`date -d ${DATE} +%-d %b %Y`
import_file.sh ${FILENAME}
cat rerun_import_file.tmpl | sed -e "s/XXX/${REPLACEMENT}/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
done
La clave aquí es la conversión inicial de todos los nombres de directorio (filtrados para determinar su validez) a un formato de tiempo ordenable (en este caso, tiempo de 'época' de Unix), ordenarlos y luego convertirlos nuevamente (a dos formas diferentes).
Si está trabajando con fechas en algo más que un sentido puramente de manipulación de cadenas, le recomiendo encarecidamente leer la página de manual para 'fecha'. De hecho, léelo dos veces, piénsalo bien y luego léelo de nuevo. 'fecha' es un comando extremadamente poderoso en su dominio.
Ah, y espero que la lección que hayas aprendido de esta experiencia sea que SIEMPRE debes usar fechas en formato ISO ( date -Iseconds
o date -I
por ejemplo). Las fechas en formato ISO se clasifican bien como cadenas utilizando, por ejemplo sort
, .