Usando GNU date
puoi scorrere facilmente una serie di date in formato AAAAMMGG:
#!/usr/bin/bash
first=$1
last=$2
while [[ $first -le $last ]]; do
match=$(date +%Y%m%d -d $first)
echo "filename_${match}.txt"
first=$(date +%Y%m%d -d "$first 1 day")
done
Aggiungi la tua elaborazione anziché echo ...
. Questo utilizza l' aritmetica della data , in cui "n giorno" è l'aggiunta di giorni alla data specificata, "-n giorno" funziona anche per la sottrazione (anche se fai attenzione a questo beartrap se è presente anche HH: MM).
(Nel caso in cui lo incontrassi, le versioni antiche date
(era di sh-utils ) consentivano una mktime()
funzione di normalizzazione, potresti semplicemente continuare ad aumentare il giorno del mese fino a 99 e lo aggiusterà in silenzio per te:
$ date -d 20160832
Thu Sep 1 00:00:00 IST 2016
)
Qualcosa di molto simile (ma probabilmente non identico nel comportamento) può essere fatto anche con i timestamp del filesystem usando GNU find
e le sue opzioni relative al tempo di modifica ( -mtime
, -daystart
e altro).
Una variante forse utile è usare il globbing esteso di bash (via @(pattern)
) in modo da poter gestire tutti i file in una volta sola:
#!/usr/bin/bash
first=$1
last=$2
globlist=$1
while [[ $first -le $last ]]; do
first=$(date +%Y%m%d -d "$first 1 day")
globlist="${globlist}|${first}"
done
shopt -s nullglob extglob
filelist="$(echo filename_@($globlist).txt)" # NB whitespace in filenames
echo "filelist is: $filelist"
filearr=( filename_@($globlist).txt ) # safer for troublesome names
declare -p filearr
Questo imposta anche in nullglob
modo che zero corrispondenze si traduca in una stringa vuota anziché in un errore. Ciò è utile quando è meglio eseguire una singola operazione su più file (ad esempio tar
o rsync
).