2017-03-09 4 views
1

J'ai le défi suivant: imaginez un arriéré important dont vous avez besoin pour pouvoir numériser à la demande. structure de répertoire est essentiellement comme suit:bash script dynamiquement définir rangee directorie

/basedirectory/2016/01/01/uniquenamedir1/session_timestamp.log 
/basedirectory/2016/01/01/uniquenamedir1/session_timestamp.log 
/basedirectory/2016/01/01/uniquenamedir1/etc.. 
/basedirectory/2016/01/01/uniquenamedir2/session_timestamp.log 
/basedirectory/2016/01/01/etc../session_timestamp.log 
/basedirectory/2016/01/02/uniquenamedir2/session_timestamp.log 
/basedirectory/yyyy/mm/dd/etc.../session_timestamp^n.log 

Vous avez l'idée. Si je voudrais la liste des journaux à une date gamme spécifique, je peux utiliser quelque chose de simple comme:

ls /basedirectory/2017/01/{04..18}/*/*.log 
# or 
ls /basedirectory/2017/01/{04,05,06}/*/*.log 
# or even 
d1="2017/01/04" 
d2="2017/01/05" 
d3="2017/01/06" 
ls /basedirectory/{"$d1","$d2""$d3"}/*/*.log 

Mais comment puis-je garder ce simple et efficace avec une date dynamique et jour dans une gamme scénario?


Voici un exemple:

#user can set date 
start_date="2017-03-07" 
#user can set amount of days 
day_range="2" 
#catch date range in this array: 
date_range=() 

#When using in a function, date_range_tmp will be a local. 
#Using it to set global date_range 
declare -a 'date_range_tmp=($(echo {'"$day_range"'..0} | xargs -I{} -d " " date -d "'"$start_date"' +{} day" --rfc-3339="date"))' 
date_range=("${date_range_tmp[@]}") 

echo "${date_range[*])" 
#2017-03-07 2017-03-08 2017-03-09 

test1="${date_range[0]}" 
#test1=2017-03-07 

test2="${date_range[-1]}" 
#test2=2017-03-09 

test3="$(IFS=\, ; echo "${date_range[*]//-/\/}")" 
#test3=2017/03/07,2017/03/08,2017/03/09 

#This, unfortunately will NOT work: 

ls /basedirectory/{"$test1".."$test2"}/*/*.log 
# or 
ls /basedirectory/{"$test3"}/*/*.log 

Note: J'utilise 'ls' ici pour plus de simplicité. Je veux l'utiliser dans un script pour "grep" les fichiers, mais affiner les dates pertinentes.

+0

Les journaux ont-ils été créés le jour correspondant à la date? Si oui, vous pouvez utiliser 'find' avec le drapeau' ctime' pour analyser le temps de création – Aserre

+0

Malheureusement non. Il est copié par lots et parfois copié manuellement de live à backup. – Asgair

Répondre

0

Je préfère ne pas utiliser "eval", car il est généralement mal vu. (La façon dont je le comprends, c'est un peu comme utiliser un canon lâche.) Voir pour une meilleure explication ici: why to avoid eval

Depuis que nous allons dans cette direction, vous n'avez pas à traverser les boucles (jeu de mots) quand vous utilisez eval.

start_date="2017-03-09" 
day_range="-2" 
declare -a 'date_range=($(echo {'"$day_range"'..0} | xargs -I{} -d " " date -d "'"$start_date"' +{} day" --rfc-3339="date"))' 

ls_path="/basedirectory/{$(IFS=\, ; echo "${date_range[*]//-/\/}")}/*/*.log" 
#ls_path=/basedirectory/{2017/03/07,2017/03/08,2017/03/09}/*/*.log 

eval ls $ls_path 

Cela fonctionne sans qu'une boucle ralentisse les choses. Mais je suis ouvert pour d'autres solutions qui n'utilisent pas de boucle ou d'évaluation

Sinon, je peux le passer à un sous-shell. Je ne suis pas sûr s'il y a des inconvénients à ceci:

bash -c "ls $ls_path" 

Cela semble fonctionner comme prévu.