Para aquellos que sólo quieren una respuesta, aquí está:
ls | sort -n -t _ -k 2 | tail -1
Aquí es el proceso de pensamiento que me condujo aquí.
Voy a suponer que la porción [RANGE] podría ser cualquier cosa.
Comience con lo que sabemos. Directorio
- de trabajo:///externas de datos entrantes
- formato de los archivos: [RANGE] _ [AAAAMMDD] .dat
Tenemos que encontrar el archivo más reciente [AAAAMMDD] en el directorio, y necesitamos almacenar ese nombre de archivo.
herramientas disponibles (sólo estoy enumerando las herramientas pertinentes para este problema ... la identificación de ellos se hace más fácil con la práctica):
Supongo que no necesitamos sed, ya que podemos trabajar con toda la salida del comando ls.La orden ls, awk, clasificar, y la cola podemos obtener el archivo correcto al igual que (tenga en cuenta que tendrá que comprobar la sintaxis en contra de lo aceptará su sistema operativo):
NEWESTFILE=`ls | awk -F_ '{print $1 $2}' | sort -n -k 2,2 | tail -1`
Entonces es sólo una cuestión de volver a poner el guión bajo, lo cual no debería ser demasiado difícil.
EDIT: Tenía un poco de tiempo, así que me puse a arreglar el comando, al menos para usar en Solaris.
Aquí está la primera pasada intrincada (esto supone que TODOS los archivos en el directorio están en el mismo formato: [RANGE] _ [aaaammdd] .dat). Estoy apostando que hay mejores maneras de hacer esto, pero esto funciona con mis propios datos de prueba (de hecho, he encontrado una mejor forma en este momento; véase más adelante):
ls | awk -F_ '{print $1 " " $2}' | sort -n -k 2 | tail -1 | sed 's/ /_/'
... al escribir esto , Descubrí que puedes hacer esto:
ls | sort -n -t _ -k 2 | tail -1
Lo dividiré en partes.
ls
Bastante simple ... obtiene la lista de directorios, solo nombres de archivos. Ahora puedo conectarlo a la siguiente orden.
awk -F_ '{print $1 " " $2}'
Este es el comando AWK. te permite tomar una línea de entrada y modificarla de una manera específica. Aquí, todo lo que estoy haciendo es especificar que awk debería interrumpir la entrada donde haya un underscord (_). Lo hago con la opción -F. Esto me da dos mitades de cada nombre de archivo. Luego le digo a awk que publique la primera mitad ($ 1), seguido de un espacio ("") , seguido de la segunda mitad ($ 2). Tenga en cuenta que el espacio era la parte que faltaba en mi sugerencia inicial. Además, esto no es necesario, ya que puede especificar un separador en el comando de ordenamiento a continuación.
Ahora la salida se divide en [RANGE] [aaaammdd] .dat en cada línea. Ahora podemos ordenar esto:
sort -n -k 2
Esto toma la entrada y la ordena según el segundo campo. El comando de ordenamiento usa espacios en blanco como un separador por defecto. Mientras escribía esta actualización, encontré la documentación para ordenar, que le permite especificar el separador, por lo que AWK y SED son innecesarios. Tome la ls y písela de la siguiente manera:
sort -n -t _ -k 2
Esto consigue el mismo resultado. Ahora sólo desea que el último archivo, por lo que:
tail -1
Si utilizó awk para separar el archivo (que se acaba de añadir complejidad extra, así que no lo haga tímida), puede reemplazar el espacio con un guión de nuevo con SED:
sed 's/ /_/'
buena información aquí, pero estoy seguro que la mayoría de la gente no va a leer hasta la parte inferior de esta manera.
¿Puede [RANGE] ser una combinación de dos caracteres? Eso hace una gran diferencia, como probablemente notará por las respuestas ya dadas. –
Sí, pueden ser diferentes. Y también la misma carpeta contendrá otros tipos de archivos con nombres que no son los que se muestran arriba. – ziggy