Script UNIX pour une liste de chaînes trouver ceux qui ne sont dans aucun fichier

J’parsing un fichier de propriétés pour obtenir une liste de propriétés defiend. Je veux vérifier tous les endroits où ces propriétés sont utilisées (répertoire cible et sous-répertoires), en marquant tout ce qui est défini dans le fichier de propriétés mais qui n’est utilisé nulle part dans le répertoire targer. Jusqu’ici j’ai

FILE=$1 TARGETROOT=$2 for LINE in `grep '[AZ]*=' $FILE | awk -F '=' '{print$1}'`; do done; 

Dans cette boucle, je veux trouver les vars $ LINE qui ne sont pas dans $ TARGETROOT ou ses sous-répertoires

Exemple de fichiers

 Properties File a=1 b=2 c=3 ... 

De nombreux fichiers contenant des références à des propriétés via

 FILE 1 PropAValue = a 

vérifiez le code retour de grep.

Vous pouvez le faire en inspectant le $? variable.

si c’est 0, la chaîne a été trouvée, sinon la chaîne n’a pas été trouvée. Si ce n’est pas le cas 0, ajoutez cette chaîne à un tableau “introuvable” et cela devrait être votre liste de propriétés non trouvées.

 grep "ssortingng" if [$? -ne 0] then ssortingng not found fi 
  • Utiliser xyz | while read PROP xyz | while read PROP au lieu de for PROP in ``xyz``; do for PROP in ``xyz``; do pour les cas où xyz peut devenir arbitrairement grand
  • Utiliser grep -l ... >/dev/null || xyz grep -l ... >/dev/null || xyz pour exécuter xyz si grep ne correspond pas, et ignorer la sortie grep do /dev/null sans exécuter xyz si une correspondance est trouvée ( -l arrête grep après la première correspondance, le cas échéant, la rendant plus efficace)

     FILE=$1 TARGETROOT=$2 grep '^[AZ]*=' "$FILE2" | awk -F= '{print$1}' | while read PROP ; do find "$TARGETROOT" -type f | while read FILE2 ; do grep -l "^${PROP}=" "$FILE2" >/dev/null || { echo "Propery $PROP missing from $FILE2" } done done 

Si vous traitez un grand nombre de propriétés et / ou de fichiers sous $TARGETROOT vous pouvez utiliser l’approche plus efficace suivante (qui ouvre et parsing chaque fichier une seule fois au lieu des N fois de la solution précédente, N étant le nombre de propriétés dans $FILE ):

  • Utiliser un fichier temporaire avec toutes les propriétés sortingées de $FILE pour éviter la duplication du travail
  • Utiliser awk ... | sort -u awk ... | sort -u pour isoler toutes les propriétés sortingées apparaissant dans un autre fichier $FILE2
  • Utiliser comm -23 "$PROPSFILE" - pour isoler les lignes (propriétés) qui apparaissent uniquement dans $PROPSFILE et non sur l’entrée standard (c’est-à-dire dans $FILE2 )

     FILE=$1 TARGETROOT=$2 PROPSFILE="/tmp/~props.$$" grep '^[AZ]*=' "$FILE" | awk -F= '{print$1}' | sort -u >"$PROPSFILE" find "$TARGETROOT" -type f | while read FILE2 ; do grep '^[AZ]*=' "$FILE2" | awk -F= '{print$1}' | sort -u | comm -23 "$PROPSFILE" - | while read PROP ; do echo "Propery $PROP missing from $FILE2" done done rm -f "$PROPSFILE"