2012-06-25 7 views
16

Necesito procesar una gran cantidad de archivos en un directorio. Los archivos se pueden dividir en varios grupos, según los nombres de los archivos. Es decir, los nombres de archivo pueden ser patronados a la cual pertenecen los "grupos" a los que pertenecen. Por ejemplo, los nombres son así:Script Bash para iterar archivos en el directorio y nombres de archivo de coincidencia de patrones

  • AAAAMMDD _ * _ bulk_import.csv
  • AAAAMMDD _ * _ genstats_import.csv
  • YYYYMMDD_ * allstats.csv

etc ...

Cada 'grupo' tiene una metodología de procesamiento diferente (es decir, se requiere un comando diferente para el procesamiento).

Quiero escribir un script bash para:

  1. iterar a través de todos los archivos CSV en el directorio
  2. Determine qué 'grupo' pertenece un archivo a por coincidencia de patrones su nombre a los patrones conocidos (como el ejemplos que di más arriba)
  3. Llamar a un comando basado en la agrupación determinada.

Funciono en Ubuntu 10.0.4. Soy nuevo en bash, y agradecería el fragmento de código esqueleto que me ayudará a comenzar a escribir este script.

Respuesta

34

La manera más fácil es, probablemente, iterar cada grupo por separado. Este lado-pasa el problema de análisis por completo.

DIRECTORY=. 

for i in $DIRECTORY/YYYYMMDD_*_bulk_import.csv; do 
    # Process $i 
done 

for i in $DIRECTORY/YYYYMMDD_*_genstats_import.csv; do 
    # Process $i 
done 

for i in $DIRECTORY/YYYYMMDD_*allstats.csv; do 
    # Process $i 
done 

Establezca DIRECTORY en el directorio que desee buscar. El valor predeterminado . buscará en el directorio de trabajo actual.

+0

Agradable y simple. ¡Obtiene mi voto! –

+0

¿Habría una manera simple de obtener el "valor" de '*' en el ciclo? – luckydonald

6

Aquí está la iteración básica sobre los archivos, con el bloque de interruptores para determinar el tipo de archivo.

#!/bin/bash 
for f in *; do 
     case $f in 
       [0-9]*_bulk_import.csv) 
         echo $f case 1 
         ;; 
       [0-9]*_genstats_import.csv) 
         echo $f case 2 
         ;; 
       [0-9]*allstats.csv) 
         echo $f case 3 
         ;; 
     esac 
done 
Cuestiones relacionadas