Per coloro che vogliono solo una risposta, qui è:
ls | sort -n -t _ -k 2 | tail -1
Ecco il processo di pensiero che mi ha portato qui.
Ho intenzione di assumere che la parte [RANGE] potrebbe essere qualsiasi cosa.
Inizia con quello che sappiamo. Directory
- di lavoro:// esterni/dati in arrivo
- formato dei file: [RANGE] _ [AAAAMMGG] .dat
Abbiamo bisogno di trovare il file più recente [AAAAMMGG] in la directory e abbiamo bisogno di memorizzare quel nome di file.
strumenti disponibili (Sono solo che elenca gli strumenti rilevanti per questo problema ... identificandoli diventa più facile con la pratica):
Suppongo che non abbiamo bisogno di sed, dal momento che possiamo lavorare con l'intero output del comando ls.Usando ls, awk, ordinare, e la coda possiamo ottenere il file corretto in questo modo (tenere a mente che dovrete controllare la sintassi contro ciò che accetterà il vostro sistema operativo):
NEWESTFILE=`ls | awk -F_ '{print $1 $2}' | sort -n -k 2,2 | tail -1`
Poi è solo una questione di inserire il carattere di sottolineatura, che non dovrebbe essere troppo difficile.
EDIT: Ho avuto un po 'di tempo, quindi sono riuscito a correggere il comando, almeno per l'uso in Solaris.
Ecco il primo passaggio convoluto (ciò presuppone che TUTTI i file nella directory siano nello stesso formato: [RANGE] _ [yyyymmdd] .dat). Scommetto che ci sono modi migliori per fare questo, ma questo funziona con i miei dati di test (in realtà, ho trovato un modo migliore in questo momento; vedi sotto):
ls | awk -F_ '{print $1 " " $2}' | sort -n -k 2 | tail -1 | sed 's/ /_/'
... durante la scrittura questo fuori , Ho scoperto che puoi fare solo questo:
ls | sort -n -t _ -k 2 | tail -1
Scomporlo in parti.
ls
Abbastanza semplice ... ottiene l'elenco delle directory, solo i nomi dei file. Ora posso collegarlo al prossimo comando.
awk -F_ '{print $1 " " $2}'
Questo è il comando AWK. ti consente di prendere una riga di input e modificarla in un modo specifico. Qui, tutto quello che sto facendo è specificare che awk dovrebbe interrompere l'input ovunque ci sia un underscord (_). Lo faccio con l'opzione -F. Questo mi dà due metà di ciascun nome di file. Dico quindi awk di emettere la prima metà ($ 1), seguita da uno spazio ("") , seguito dalla seconda metà ($ 2). Si noti che lo spazio era la parte che mancava dal mio suggerimento iniziale. Inoltre, questo non è necessario, dal momento che è possibile specificare un separatore nel comando di ordinamento sottostante.
Ora l'uscita è divisa in [RANGE] [aaaammgg] .dat su ogni riga. Ora possiamo ordinare:
sort -n -k 2
Questo prende l'input e lo ordina in base al 2 ° campo. Il comando sort usa gli spazi bianchi come separatore per impostazione predefinita. Durante la scrittura di questo aggiornamento, ho trovato la documentazione per l'ordinamento, che consente di specificare il separatore, quindi AWK e SED non sono necessari. Prendere la ls e collegarla al seguente tipo:
sort -n -t _ -k 2
Questo raggiunge lo stesso risultato. Ora si vuole solo l'ultimo file, in modo da:
tail -1
Se è stato utilizzato awk per separare il file (che è solo l'aggiunta di complessità in più, in modo da non farlo imbarazzato), è possibile sostituire lo spazio con una sottolineatura di nuovo con sed:
sed 's/ /_/'
Alcune buone informazioni qui, ma sono sicuro che la maggior parte delle persone non stanno andando a leggere fino in fondo come questo.
È possibile che [RANGE] sia una combinazione di due caratteri? Questo fa una grande differenza, come probabilmente noterai dalle risposte già date. –
Sì, possono essere diversi. E anche la stessa cartella conterrà altri tipi di file con nomi diversi da quelli mostrati sopra. – ziggy