2010-03-18 11 views
0

Salutations,Technique améliorée pour stocker un nom de fichier dans une variable?

J'ai besoin de stocker le nom de fichier d'un journal dans une variable afin que mon script puisse effectuer des vérifications sur les fichiers journaux quotidiens. Ces journaux ont toujours un nom différent car ils ont un horodatage dans le nom. Actuellement, j'utilise une méthode hodge podged qui envoie une commande ls pour sed, trier, couper et tail afin d'obtenir le nom.

CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]*\).*/\1 &/' | sort -n | cut -d ' ' -f2- | tail -1) 

MISE À JOUR:

$ CRON_DATE est fourni comme argument au script. C'est la date (au jour) sur laquelle le journal a été créé. Parfois, plusieurs journaux existeront pour le même jour, donc je veux que ce soit le plus récent.

Quelques noms typiques:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
etc ...

S'il vous plaît garder à l'esprit que cela fonctionne comme cela est. Je pense juste qu'il est moche et j'essaie de trouver une meilleure façon de le retirer. Je suis assez sûr que j'ai mélangé ceci ensemble de quelques trucs que j'ai trouvés google il ya quelques mois. ça marche maintenant mais je ne suis pas vraiment content de la technique. J'ai quelques idées sur la façon de faire mieux, mais j'ai eu beaucoup de succès sur ce site avant et je pensais qu'il serait préférable de se référer aux dieux stackoverflow d'abord. Toutes les réponses sont grandement appréciées.

Merci, Ryan

+0

Vous devez donner plus d'informations ici. Quels sont les noms de fichiers typiques? Quel fichier journal souhaitez-vous obtenir? Qu'est-ce que '$ CRON_DATE'? –

+1

Mis à jour. Merci pour la note. – SDGuero

+1

Je vais vous dire ce qui va l'améliorer en ce moment - sortez cela en quelques opérations. Faire un one-liner comme ça est un bon moyen de regarder le code plus tard et de vous faire faire un facepalm. La lisibilité est toujours mieux que d'être intelligent, 0) –

Répondre

2

Que diriez-vous

CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1) 

EDIT: Vous avez raison BTA, je aurais dû attraper ça. Fixé.

+1

Cela obtiendrait le journal le plus récent, mais je pense que l'OP veut obtenir le journal le plus récent d'une date spécifiée (passé via $ CHRON_DATE). – bta

+0

Beaucoup plus propre que ce que je fais maintenant. Merci! : D – SDGuero

1

Une fois que vous analysez un fichier journal, faire quelque chose pour marquer qu'il a été traité, un tel changement de nom ou le déplacer vers un autre dossier. De cette façon, peu importe quand le fichier a été créé, seulement qu'il n'a pas encore été analysé.

Je suggère également d'utiliser un langage de script de plus haut niveau.

0

vous pouvez changer votre date triables par préfixer l'année à l'avant, puis faire

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1) 
+0

Cela ne fonctionnerait pas tel quel parce que toutes les dates '" false "' seraient alphabétisées avant l'une des dates '" true "', que l'année soit préfixée ou non. Vous auriez besoin d'une autre étape pour supprimer la date du texte. – bta

+0

s'il vous plaît noter que OP mentionné sa commande fonctionne comme est. – ghostdog74

1
#!/bin/bash 
shopt -s nullglob 

last= 
for file in "$LOGS_DIR"/fetch_cron_{false,true}_"$CRON_DATE"*.log 
do 
    last="$file" 
done 

if [ -n "$last" ] 
then 
    echo "$last" 
else 
    echo "No match found" >&2 
    exit 1 
fi 
+0

Hmm. C'est intéressant ... j'aime le piège et j'y penserai plus loin. Merci. – SDGuero

1

Pour commencer, essayez:

FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log` 
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1` 

qui se débarrasse des cut et des métiers de la sed expression régulière pour un appel plus lisible (IMO) à tr. Le découper en deux lignes aide également à la clarté.

Si vous n'avez pas d'autres fichiers dans $LOGS_DIR avec des noms de fichiers très similaires (qui se produit généralement si vous conservez les journaux en question dans leur propre dossier), vous pouvez remplacer le paramètre à ls avec quelque chose de plus simple comme $LOGS_DIR/fetch_*_$CRON_DATE*.log. Par souci de simplicité, ne compliquez pas la ligne au besoin pour vous assurer d'obtenir uniquement les fichiers dont vous avez besoin.

+0

Merci Bta. J'ai choisi le vôtre d'abord, mais j'ai vu Beta ci-dessous (que vous avez aidé à réparer) qui a également fonctionné. Je vais utiliser cette solution mais merci pour l'aide. – SDGuero