J'essaie de créer un script qui bougera via des fichiers qui ont leurs noms de fichiers écrites dans le format suivant: yyyymmdd.hh.filename.
Le script est appelé avec: p>
cat 20091026.00.filename |more cat 20091026.01.filename |more ... cat 20091026.23.filename |more cat 20091027.01.filename |more cat 20091027.02.filename |more ...
3 Réponses :
Une solution possible: convertissez les dates en une représentation standard UNIX de «secondes passées depuis l'époque» et de la boucle, augmentant ce nombre de 3600 (nombre de secondes en une heure) chaque itération. Exemple:
Suggérez qu'il y a 3600 secondes par heure - et incrémentez les heures à la demande.
Ce code fait quelques heures de différence à cause du fuseau horaire.
Que diriez-vous:
#!/bin/bash
date1=$1
date2=$2
#verify dates
if ! date -d "$date1" 2>&1 > /dev/null ;
then echo "first date is invalid" ; exit 1
fi
if ! date -d "$date2" 2>&1 > /dev/null ;
then echo "second date is invalid" ; exit 1
fi
#set current and end date
current=$(date -d "$date1")
end=$(date -d "$date2 +1 hours")
#loop over all dates
while [ "$end" != "$current" ]
do
file=$(date -d "$current" +%Y%m%d.%H)
cat $file."filename" | more
current=$(date -d "$current +1 hours")
done
C'est raisonnable pour les dates mais ne gère pas du tout des heures. En fait, c'est un peu suspect pour les dates également - si vous le donnez les arguments 20091027 et 20091028, vous obtenez de 20091027.00 à 20091028.00 - Je m'attends à ce qu'il s'arrête à 1027.23 ou 1028.23.
Il gère des heures si vous l'appelez avec "20091027 00" "20091028 03", a oublié de mentionner cela.
Aaah, ça vaut mieux. Vraisemblablement, la date de la tâche grogneuse. Pas mal.
Vous pouvez utiliser la valeur de retour de date code> au lieu de greffing pour un message d'erreur: si! Date -d "$ Date1"> / dev / null 2> & 1; alors echo "Première date est invalide"; sortie 1; fi code> et les x ne sont pas nécessaires dans le pendant code> instruction. Utilisation inutile de chat code>
Merci pour les conseils, mis à jour mon code. Mais je ne vois pas quelle utilisation inutile de chat vous voulez dire, l'utilisateur souhaitait explicitement le script de "CAT 20091026.00.FILENAME" | Plus "
Oui ma faute de tête. Je ne suis pas chat'n les fichiers - faire un peu plus - juste dactylographié dans une commande et parlais avec un autre gars à propos de la tuyauterie à plus - lol l'a écrit aussi. Nice Code Man. J'avais commencé avec l'autre - mais c'est bon.
Txn !!! Envoyez mes informations sur PayPal / Quelques informations sur MyFirstName.MylastName @ gmail.com I LL Achetez-vous une bière !!!
Pour traiter chaque fichier entre deux dates / heures indiquées, vous pouvez utiliser ce qui suit: lorsque vous créez les fichiers Comme vous pouvez le constater, le premier argument doit être de la Format correct Ceci ne tente que de traiter les fichiers existants (à partir de Au fait, voici la commande qui a créé les fichiers de test, si vous êtes intéressé: p> Veuillez ne pas taper que dans Verbatim puis vous plaignez-vous de créer des fichiers comme: em > p> je n'ai que coupé la ligne de sorte que cela correspond à la largeur de code. em>: -) p> p> p> 20091026.00. $ {aléatoire} code> à travers 20091028.23. $ {aléatoire} code> inclusif, il s'agit d'un couple d'échantillons d'exécutions: p> yyyymmdd.hh code>. Le deuxième argument peut être plus court puisqu'il hérite le début du premier argument pour en faire la longueur correcte. P> LS code>) et de Le format correct, pas em> chaque date / heure dans la plage. Ce sera plus efficace si vous avez des fichiers clairsemés (y compris au début et à la fin de la plage), car il n'a pas besoin de vérifier que les fichiers existent. P>
wow je suis époustouflé avec les réponses. Je reviendrai à Ya'll.
Si quelqu'un entre ./loopscript.sh 20091026.07 sans valeur. Il fonctionnera à partir de 20091026.07 à 20091023.07 est-il un moyen de la défaut de .23? J'ai ceci pour la partie supérieure du code pour définir la date actuelle comme des heures ST / fin de = "$ (date +% y) $ (date +% m) $ (date +% d)". 00 "to =" $ (date +% y) $ (date +% m) $ (date +% d) ". 23" si [! -z "2 $"]]; Puis de = 2 $ si [! -z "3 3"]]; puis à = 3 $ si [$ {# # de} -ne 11 || $ {# à} -gt 11]]; puis une sortie d'utilisation 1 fi si [[$ {# to} -lt $ {# de}]]; puis à = $ {de: 0: $ ($ {# # de} - $ {# à}))} $ {to} fi
Au lieu de vos deux premiers tests, effectuez directement le troisième test sur les paramètres de position directement: $ {# 1} code> suivi des affectations comme: de = $ {1: -1 / code >. Création de la boucle interne des fichiers de test: pour tm en 0 {0..24}; do Touch $ dt. $ {tm: -2}. $ aléatoire; fait code> ou sans une boucle interne: tactile $ dt.0 {0..9}. $ aléatoire; toucher $ dt. {10..19}. $ aléatoire; Touchez $ dt. {20..23}. $ aléatoire code>
@CHASESTER: FYI, vous pouvez faire date +% y% m% d code> tout à la fois.
@CHASESTER, voir ma mise à jour pour savoir comment défaut de fin de journée si le premier argument fourni mais pas secondaire.
Vous pouvez utiliser SEQ code> dans la seconde pour la boucle lors de la création de fichiers de test si vous souhaitez que le code s'adapte: pour TM en $ (SEQ -F '% 02.f' 0 23); faire code>
Utilisation inutile de
chat code>: il suffit d'utiliserplus nom de fichier code>