¿Cómo escribir un script bash eficiente para buscar y ordenar archivos y directorios, extrayendo fechas?

¿Cómo escribir un script bash eficiente para buscar y ordenar archivos y directorios, extrayendo fechas?

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:

  1. encontrar todos los directorios que se ajusten al patrón de fechas

  2. ordenar las fechas correctamente (muy importante para la configuración)

  3. 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 -Isecondso date -Ipor ejemplo). Las fechas en formato ISO se clasifican bien como cadenas utilizando, por ejemplo sort, .

información relacionada