web-dev-qa-db-fra.com

Script Bash pour itérer les fichiers dans le répertoire et les noms de fichiers de correspondance de modèle

J'ai besoin de traiter un grand nombre de fichiers dans un répertoire. Les fichiers peuvent être partitionnés en plusieurs groupes, en fonction des noms de fichiers. C'est-à-dire que les noms de fichiers peuvent correspondre à un modèle auquel ils appartiennent. Par exemple, les noms sont comme ceci:

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

etc ...

Chaque `` groupe '' a une méthodologie de traitement différente (c'est-à-dire qu'une commande différente est appelée pour le traitement).

Je veux écrire un script bash pour:

  1. Parcourez tous les fichiers CSV du répertoire
  2. Déterminez à quel "groupe" un fichier appartient en configurant son nom avec des modèles connus (comme les exemples que j'ai donnés ci-dessus)
  3. Appelez une commande basée sur le groupement déterminé.

Je cours sur Ubuntu 10.0.4. Je suis nouveau sur bash et j'apprécierais l'extrait de code squelette qui m'aidera à commencer à écrire ce script.

26

Le moyen le plus simple consiste probablement à répéter chaque groupe séparément. Cela contourne complètement le problème d'analyse.

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

Définissez DIRECTORY dans le répertoire que vous souhaitez rechercher. Le défaut . recherchera le répertoire de travail actuel.

48
cdhowie

Voici l'itération de base sur les fichiers, avec un commutateur pour déterminer le type de fichier.

#!/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
7
jazgot